使用 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;    
    }

    ...
}