#java #android #gradle #threetenbp
#java #Android #градация #threetenbp #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
все еще используется.
Спасибо, Пьер
Комментарии:
1. Вы пробовали помечать ThreeTen для своих тестов как ‘testRuntime’? Смотрите следующее
2. На самом деле это работает так, как я пытался, просто Android Studio не понимала новую строку testCompile, которую я добавил в сценарий сборки. Я перезапустил IDE , и она заработала отлично … Странно … В любом случае, спасибо вам
3. кроме того, вы можете создать jar только для tzdb, который вы можете добавить в свою конфигурацию testCompile: threeten.org/threetenbp/update-tzdb.html
4. Да, gradle может быть таким привередливым. Кажется, я припоминаю, что сталкивался с этой проблемой в прошлом. Какую IDE вы используете?
Ответ №1:
Не уверен, уместно ли это в вашем случае, но один подход следует рассмотреть:
- Если вы еще не используете ThreeTenABP (серверный порт ThreeTen для Android), который эффективно инициализирует информацию о часовом поясе на Android, переключитесь на его использование.
- В ваших модульных тестах используйте оригинальный серверный порт JVM (threetenbp).
Я был вдохновлен https://github.com/JakeWharton/ThreeTenABP/issues/14 чтобы попробовать JVM backport в тестах, и у меня это работает.
Итак, в 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()
, работают нормально. (В ThreeTen не вызывается тип DateTime
.)
Ответ №2:
Если вы используете 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