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 ответа
Не уверен, что это уместно в вашем случае, но один подход для рассмотрения:
- Если вы еще не используете ThreeTenABP (ThreeTen Android Backport), которая эффективно инициализирует информацию о часовых поясах на Android, переключитесь на ее использование.
- В своих юнит-тестах используйте оригинальный бэкпорт 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