1

在纯 Java 模块中,我依赖于compile group: 'org.threeten', name: 'threetenbp', version: threeTenVersion, classifier: 'no-tzdb'. 我正在使用该no-tzdb变体,因为此模块将在 Android 应用程序中使用,并且 tzdb 将由 Android 模块添加。

但是,在我的单元测试中,我希望能够调用一些方法,比如DateTime.now()需要使用 tzdb 初始化 ThreeTen。

我想知道是否有办法仅在单元测试期间使用另一个版本的库,以便我可以使用安装了 tzdb 的版本?

我已经尝试过以下方法:

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

no-tzdb仍在使用。

谢谢你,皮埃尔

4

2 回答 2

1

不确定这是否与您的情况相关,但可以考虑一种方法:

  1. 如果您还没有使用ThreeTenABP (ThreeTen Android Backport ),它可以有效地初始化 Android 上的时区信息,请切换到使用它。
  2. 在您的单元测试中,使用原始的 JVM backport ( 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( ThreeTen中没有调用类型。)

于 2017-01-09T11:00:53.683 回答
0

如果您使用 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.datsrc/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

于 2017-02-02T15:42:41.170 回答