使用 JMockit 和 Kotlin 捕获对象
Capturing objects with JMockit and Kotlin
我使用 JMockit 已经有一段时间了,我真的很喜欢它。但是,我只是 运行 遇到了一个我似乎无法解决的问题。请参阅下面的代码片段,了解一些 Kotlin 测试代码,测试 Kotlin 生产代码。
@Injectable
lateinit var experimentStorage: ExperimentStorage
...
val experimentCaptor = mutableListOf<Experiment>()
object : Verifications() {
init {
experimentStorage.save(withCapture(experimentCaptor))
}
}
当我 运行 我的测试出现以下错误:
java.lang.IllegalStateException: withCapture(experimentCaptor) must
not be null
我 100% 确定我的生产代码正确地执行了存储,因为当我像下面这样替换捕获时,我的测试成功了:
object : Verifications() {
init {
experimentStorage.save(withAny(experiment))
}
}
有没有人有使用 JMockit (1.28) 在 Kotlin 中捕获参数的经验?我究竟做错了什么?我想这与 init
块有关,因为在 Java 中你会使用 static space...
最终我无法在 Kotlin 中找到解决此问题的任何方法。问题在于静态 space。在 Kotlin 中,你有 init
块,你必须在其中记录你的 Expectations
/Verifications
,但 JMockit 实际上期望它在静态 space 中(因此 {{...}}
表示法) .
我现在的解决方法是将俘虏留在 Java,所以我的 java 测试源中有一个 Captors
class,看起来像这样
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;
}
...
}
我使用 JMockit 已经有一段时间了,我真的很喜欢它。但是,我只是 运行 遇到了一个我似乎无法解决的问题。请参阅下面的代码片段,了解一些 Kotlin 测试代码,测试 Kotlin 生产代码。
@Injectable
lateinit var experimentStorage: ExperimentStorage
...
val experimentCaptor = mutableListOf<Experiment>()
object : Verifications() {
init {
experimentStorage.save(withCapture(experimentCaptor))
}
}
当我 运行 我的测试出现以下错误:
java.lang.IllegalStateException: withCapture(experimentCaptor) must not be null
我 100% 确定我的生产代码正确地执行了存储,因为当我像下面这样替换捕获时,我的测试成功了:
object : Verifications() {
init {
experimentStorage.save(withAny(experiment))
}
}
有没有人有使用 JMockit (1.28) 在 Kotlin 中捕获参数的经验?我究竟做错了什么?我想这与 init
块有关,因为在 Java 中你会使用 static space...
最终我无法在 Kotlin 中找到解决此问题的任何方法。问题在于静态 space。在 Kotlin 中,你有 init
块,你必须在其中记录你的 Expectations
/Verifications
,但 JMockit 实际上期望它在静态 space 中(因此 {{...}}
表示法) .
我现在的解决方法是将俘虏留在 Java,所以我的 java 测试源中有一个 Captors
class,看起来像这样
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;
}
...
}