如果我正确地理解了你,你想用模拟的构造函数测试一个类。这不是测试的好方法,因为您不是以最纯粹的形式测试生产代码。
但是,并非所有事情都按照规则进行,是吗? :)所以,如果你坚持,JMockIt会让你这样做。你可以模拟出构造函数并测试其他方法。嘲笑建设者在JMockIt project site有详细记录。
这里是一个快速演示中,您可以尝试自己:
生产代码:
// src/main/java/pkg/SomeClass.java
public class SomeClass {
public static void main(String[] args) {
new SomeClass("a", 2);
}
public SomeClass(String a, Integer b) {
System.out.println("Production constructor called");
}
}
模拟代码:
// src/test/java/pkg/SomeMock.java
import mockit.Mock;
import mockit.MockUp;
public class SomeMock extends MockUp<SomeClass> {
@Mock
public void $init(String a, Integer b) {
System.out.println("Mock constructor called");
}
}
测试代码:
// srce/test/java/pkg/SomeTest.java
import org.junit.Test;
public class SomeTest {
@Test
public void test() {
new SomeMock();
new SomeClass("a", 2);
}
}
运行生产 代码将打印Production constructor called
,但在测试中运行它将打印Mock constructor called
。
感谢您的回答。我会试试看。 – userx
'如果我已经正确理解了你,你想用模拟的构造函数测试一个类。这不是测试的好方法,因为您不是以最纯粹的形式测试生产代码。“我完全不同意。以最纯粹的形式进行单元测试(白盒测试 - 这就是JMockit的用处)是测试单个单元。如果您正在测试一个不是复杂构造函数的特定单元,那么允许它执行的是黑盒测试,当您尝试进行单元测试时,这是非常糟糕的。 – searchengine27
但是如何在模拟你的构造函数时(在$ init()方法内)设置对象的字段? – supertonsky