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
执行单元测试时出现。
我目前正在尝试测试我的代码的执行路径,但我 运行 在涉及嵌套 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
执行单元测试时出现。