使用JMockit和Kotlin捕获对象

时间:2016-11-21 15:08:18

标签: unit-testing kotlin jmockit

我已经使用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中你会使用静态空间......

1 个答案:

答案 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;    
    }

    ...
}