我目前正在尝试测试代码的执行路径,但是当遇到嵌套的类成员变量时,我遇到了一些问题。考虑以下类结构:
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是不是意味着以这种方式使用?我是这个测试工具包的新手,所以对此问题的任何帮助或见解将不胜感激。
答案 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
的模拟。