我正在尝试运行这样的单元测试:
@org.junit.jupiter.api.Test
void junit5codeCoverage() {
final int result = new Foo().junit5();
Assert.assertEquals(Looper.getMainLooper().getThread(), Thread.currentThread());
assertEquals(-1, result);
}
这是使用 Robolectric 对 Android 依赖项(即 Looper.getMainLooper()
)进行的
Junit5测试。
我正在使用来自 mannodermaus 的 junit5 android 插件,它允许在 Android 设置中运行 junit5。但这并不能开箱即用,因为它不会加载 robolectric。所以我尝试了 alixwar 的分支,它可以解决 robolectric 和 junit5 测试覆盖率,但仍然不会使用 Android 类。
我还开始研究如何在 junit5 上运行 robolectric 测试,这需要了解
RobolectricTestRunner
的工作原理以及如何将代码移植到 JUnit5 平台。我对新的 junit5 平台知之甚少,但我发现我可以在 org.junit.platform.runner.JUnitPlatform
运行器之上进行构建,以遵循测试运行器概念,这是 junit-platform-runner
包的一部分。但这距离原来的 Junit4 SandBoxTestRunner
太远了,我无法完成移植。
那么实现 robolectric junit5 支持的最可行的路径是什么,或者我是否缺少任何(明显的)概念?
您可以使用
junit-vintage-engine
使用 JUnit4 中的运行器运行测试。
org.junit.vintage:junit-vintage-engine
添加到您的依赖项中,这样您就可以为您的测试添加 org.junit.runner.RunWith
注释。
我也在尝试这样做,但似乎在撰写本文时,Robolectric 根本不支持 junit5。
请参阅此处的讨论:https://github.com/robolectric/robolectric/issues/2996
该讨论中描述了一些解决方法,但现在我将坚持使用 junit4。
我已经开始了一个实验项目:https://github.com/apter-tech/junit5-robolectric-extension
使用此扩展和 gradle 插件,您可以运行 Robolectric 测试并在测试中使用 JUnit5 Jupiter api。
如果您有任何疑问,请提出问题或拉取请求。