JMockit注入嵌套成员变量

JMockit injecting nested member variables

我目前正在尝试测试我的代码的执行路径,但我 运行 在涉及嵌套 class 成员变量时遇到了一些问题。考虑以下 class 结构:

System (System under test)
 -> ClassA
   -> ClassB
     -> ClassC

名为 System 的 class 包含 ClassA 的实例,并将调用其方法之一。 ClassA 将类似地包含 ClassB 的一个实例,并将调用它的方法之一,等等。

@RunWith(JMockit.class)
public class SomeTest {
    @Tested
    private System system;

    @Injectable
    private ClassA memberA;

    @Injectable
    private ClassB memberB;

    @Injectable
    private ClassC memberC;

    @Test
    public void doSystemTest() {
        // Do stuff
        system.handle();

        new Verifications() {
            {
                system.handle(); times = 1;
                memberA.doSomeAStuff(); times = 1;
                memberB.doSomeBStuff(); times = 1; // Results in test failure: 
            }
        };
    }
}

当我运行这个测试时,我得到以下错误:

Missing 1 invocation to: ca.kgli.jmockit.ClassB#doSomeBStuff() on mock instance: ca.kgli.jmockit.ClassB@1a052a00

供参考,这里是代码:

public class System {
    private ClassA memberA;

    public void handle() {
        memberA.doSomeAStuff();
    }
}

public class ClassA {
    private ClassB memberB;

    public void doSomeAStuff() {
        memberB.doSomeBStuff();
    }
}

public class ClassB {
    private ClassC member;

    public void doSomeBStuff() {
        member.stuffCSays("arsenic");
    }
}

public class ClassC {
    public String stuffCSays(String input) {
        return "Hello, " + input;
    }
}

所以我的问题是,为什么 doSomeBStuff 方法没有被调用? JMockit 不应该以这种方式使用吗?我是这个测试工具包的新手,因此非常感谢任何对此问题的帮助或见解。

当你 mock ClassA 时,doSomeAStuff() 的真正实现被 Jmockit 拦截,所以它不会调用 doSomeBStuff().

当您对 System 执行单元测试时,您应该只模拟 ClassA

@RunWith(JMockit.class)
public class SomeTest {
    @Tested
    private System1 system;

    @Injectable
    private ClassA memberA;

    @Test
    public void doSystemTest() {
        // Do stuff
        system.handle();

        new Verifications() {
            {
                memberA.doSomeAStuff(); times = 1;
            }
        };
    }
}

ClassB 的 mock 只应在您对 ClassA 执行单元测试时出现。