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

#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:

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

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