Gradle - использовать другую версию зависимости в модульных тестах

В чистом Java-модуле у меня есть зависимость от compile group: 'org.threeten', name: 'threetenbp', version: threeTenVersion, classifier: 'no-tzdb', Я использую no-tzdb вариант, потому что этот модуль будет использоваться внутри приложения Android, а модуль tzdb будет добавлен модулем Android.

Тем не менее, в моих модульных тестах я хотел бы иметь возможность вызывать некоторые методы, такие как DateTime.now() который требует инициализации ThreeTen с помощью tzdb.

Я хотел бы знать, есть ли способ использовать другую версию библиотеки только во время модульных тестов, чтобы я мог использовать версию с установленным tzdb?

Я уже попробовал следующее:

compile group: 'org.threeten', name: 'threetenbp', version: threeTenVersion, classifier: 'no-tzdb'
    testCompile "org.threeten:threetenbp:threeTenVersion"

Но no-tzdb все еще используется.

Спасибо пьер

2 ответа

Не уверен, что это уместно в вашем случае, но один подход для рассмотрения:

  1. Если вы еще не используете ThreeTenABP (ThreeTen Android Backport), которая эффективно инициализирует информацию о часовых поясах на Android, переключитесь на ее использование.
  2. В своих юнит-тестах используйте оригинальный бэкпорт JVM ( threetenbp).

https://github.com/JakeWharton/ThreeTenABP/issues/14 вдохновил меня попробовать бэкпорт JVM в тестах, и он работает для меня.

Так в build.gradle Я имею:

compile 'com.jakewharton.threetenabp:threetenabp:1.0.4' 

// For unit tests involving ThreeTen, use JVM backport instead of Android one
testCompile('org.threeten:threetenbp:1.3.3') {
    exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp'
}

С этой настройкой, в моих модульных тестах, такие методы ZonedDateTime.now() а также OffsetDateTime.now() отлично работает (Там нет типа с именем DateTime в три десятка.)

Если вы используете Mockito, вы можете смоделировать Context и AssetManager, чтобы AndroidThreeTen загружал версию TZDB.dat вашего тестового проекта. Что-то вроде:

@Before
public void setUp() throws Exception {
    Context mockContext = mock(Context.class);
    AssetManager mockAssets = mock(AssetManager.class);
    when(mockAssets.open(anyString())).thenReturn(getClass().getClassLoader().getResourceAsStream("TZDB.dat"));
    when(mockContext.getAssets()).thenReturn(mockAssets);
    AndroidThreeTen.init(mockContext);
}

Не забудьте поставить свой TZDB.dat в src/test/resources/TZDB.dat

Если вы ищете TZDB.dat это можно найти здесь после того, как вы построили свой проект:project_directory/app/build/intermediates/exploded-aar/com.jakewharton.threetenabp/threetenabp/1.0.4/assets/org/threeten/bp/TZDB.dat

Другие вопросы по тегам