如何在 JMockit 中部分模拟依赖抽象对象

How to partially mock a dependency abstract object in JMockit

我有抽象 class D 这是测试的依赖 class T.

测试class:

public class T_Test {
    @Tested T tested;

    D dependency;

    public void test() {
        dependency.doSomething();
        tested.testedMethod(dependency);
    }
}

我想要 dependency.doSomething() 将 运行 此方法的真实代码,但抽象方法将被模拟。

  1. 如果我 运行 按原样进行测试,我显然会得到 NullPointerException 因为使用了未初始化的 dependency.

  2. 如果我将 @Mocked 注释添加到 D dependency 行,D 中的所有方法都会被模拟,所以 d.doSomething() 不会做它应该做的事。

  3. 如果我保留 @Mocked 注释并在测试方法的开头添加一个空的 NonStrictExpectations 块,以便进行部分模拟,或者像这样:

    new NonStrictExpectations(D.class) {};
    

    或者像这样:

    new NonStrictExpectations(d) {};
    

    我得到 java.lang.IllegalArgumentException: Already mocked: class D.

  4. 如果我保留 NonStrictExpectations 块并删除 @Mocked 注释,我再次得到 NullPointerException 用于使用未初始化的 dependency.

那么我怎样才能部分模拟这个依赖抽象class?

在依赖项上使用 @Capturing 注释可以实现这一点。无需添加空的期望块;只有抽象方法会被模拟。

public class T_Test {
    @Tested T tested;

    @Capturing D dependency;

    public void test() {
        dependency.doSomething();
        tested.testedMethod(dependency);
    }
}