Gradle - 在单元测试中使用其他版本的依赖项

时间:2016-10-20 18:00:02

标签: java android gradle threetenbp

在纯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

谢谢你, 皮尔

2 个答案:

答案 0 :(得分:1)

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

  1. 如果您还没有使用ThreeTenABP(ThreeTen Android Backport),它可以有效地初始化Android上的时区信息,请切换到使用它。
  2. 在您的单元测试中,使用原始JVM反向端口(threetenbp)。
  3. 我受到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()等方法可以正常工作。 (在ThreeTen中没有名为DateTime的类型。)

答案 1 :(得分: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.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