提问人:pdegand59 提问时间:10/21/2016 更新时间:2/2/2017 访问量:585
Gradle - 在单元测试中使用其他版本的依赖项
Gradle - Use other version of dependency in Unit Tests
问:
在纯 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
谢谢 皮尔
答:
不确定这是否与您的情况相关,但可以考虑一种方法:
- 如果您还没有使用 ThreeTenABP (ThreeTen Android Backport),它可以有效地初始化 Android 上的时区信息,请切换到使用它。
- 在单元测试中,使用原始 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
如果您使用的是 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
评论