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

Gradle - Use other version of dependency in Unit Tests

提问人:pdegand59 提问时间:10/21/2016 更新时间:2/2/2017 访问量:585

问:

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

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

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

我已经尝试了以下方法:

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

但仍然使用。no-tzdb

谢谢 皮尔

Java Android gradle threetenbp

评论

0赞 DivDiff 10/21/2016
您是否尝试过将测试的 threeTen 标记为“testRuntime”?请参阅以下内容
0赞 pdegand59 10/21/2016
实际上,它只是按照我尝试的方式工作,只是 Android Studio 不理解我添加到构建脚本中的新 testCompile 行。我重新启动了IDE,它运行良好......奇怪。。。无论如何,谢谢你
0赞 RaGe 10/21/2016
此外,您可以构建一个仅限 tzdb 的 jar,您可以将其添加到 testCompile 配置中: threeten.org/threetenbp/update-tzdb.html
0赞 DivDiff 10/21/2016
是的,Gradle 可以这样挑剔。我似乎记得过去遇到过这个问题。您使用什么 IDE?

答:

1赞 Jonik 1/9/2017 #1

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

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

通过这种设置,在我的单元测试中,方法喜欢和工作正常。(ThreeTen 中没有调用类型。ZonedDateTime.now()OffsetDateTime.now()DateTime

0赞 Henri Langenhoven 2/2/2017 #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.datsrc/test/resources/TZDB.dat

如果你正在寻找它,可以在你构建项目后在这里找到它:TZDB.datproject_directory/app/build/intermediates/exploded-aar/com.jakewharton.threetenabp/threetenabp/1.0.4/assets/org/threeten/bp/TZDB.dat