JMockit注入嵌套的成员变量

时间:2018-04-13 04:07:26

标签: java unit-testing junit jmockit

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

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

名为System的类包含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: 
            }
        };
    }
}

当我运行此测试时,我收到以下错误:

  

缺少1次调用:   ca.kgli.jmockit.ClassB#doSomeBStuff()      在模拟实例上: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是不是意味着以这种方式使用?我是这个测试工具包的新手,所以对此问题的任何帮助或见解将不胜感激。

1 个答案:

答案 0 :(得分:1)

当你模仿ClassA时,doSomeAStuff()的真实实现被Jmockit截获,因此它不会调用doSomeBStuff()

您只应在ClassA上执行单元测试时模拟System

@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上执行单元测试时才会出现ClassA的模拟。