我已经使用JMockit很长一段时间了,我真的很喜欢它。但是,我刚遇到一个似乎无法解决的问题。请参阅下面的代码片段,了解一些Kotlin测试代码,测试Kotlin生产代码。
@Injectable
lateinit var experimentStorage: ExperimentStorage
...
val experimentCaptor = mutableListOf<Experiment>()
object : Verifications() {
init {
experimentStorage.save(withCapture(experimentCaptor))
}
}
当我运行测试时,我收到以下错误:
java.lang.IllegalStateException:withCapture(experimentCaptor)必须 不是空的
我100%确定我的生产代码正确地运行存储,因为当我更换下面的捕获时,我的测试成功:
object : Verifications() {
init {
experimentStorage.save(withAny(experiment))
}
}
有没有人有使用JMockit(1.28)在Kotlin中捕获参数的经验?我究竟做错了什么?我想它与init
块有关,因为在Java中你会使用静态空间......
答案 0 :(得分:0)
最终我无法在Kotlin中找到解决此问题的任何方法。问题在于静态空间。在Kotlin中,您有init
块,您必须在其中记录Expectations
/ Verifications
,但JMockit实际上在静态空间中需要这个(因此{{...}}
表示法。)
我现在的解决方法是将绑定器保留在Java中,所以我的java测试源中有Captors
类,看起来像这样
public class Captors {
public static List<Experiment> experimentStorage_save(ExperimentStorage experimentStorage) {
final List<Experiment> captor = new ArrayList<>();
new Verifications() {{
experimentStorage.save(withCapture(captor));
}};
return captor;
}
...
}