Java JMockit模拟构造函数

Java JMockit模拟构造函数,java,unit-testing,jmockit,Java,Unit Testing,Jmockit,我正在单元测试一个类,它有一个复杂的构造函数(有很多参数)。构造函数接受三个参数,如: public BehavioralDischargeCarePlan_Bus(Webform webForm,String dataEntryModel, String obsBatId) { super(webForm, dataEntryModel, obsBatId); ..... 然后,构造函数调用一个超级构造函数,它变得更加复杂。使用JMockit,如何在不实际调用构造函数的情况

我正在单元测试一个类,它有一个复杂的构造函数(有很多参数)。构造函数接受三个参数,如:

public BehavioralDischargeCarePlan_Bus(Webform webForm,String dataEntryModel, String     obsBatId) {

    super(webForm, dataEntryModel, obsBatId);
.....
然后,构造函数调用一个超级构造函数,它变得更加复杂。使用JMockit,如何在不实际调用构造函数的情况下创建类的实例并测试方法?我是JMockit的新手,任何帮助都将不胜感激


谢谢

如果我理解正确,您希望使用模拟构造函数测试类。这不是一种好的测试方法,因为您没有以最纯粹的形式测试生产代码

然而,并不是所有事情都按照规则进行,是吗?:)所以如果你坚持,JMockIt会让你这么做。您可以只模拟构造函数并测试其他方法。Mocking构造函数在最新版本中有很好的文档记录

下面是一个您可以自己尝试的快速演示:

生产代码:

// 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");
    }
}

运行生产代码将打印名为的
生产构造函数,但在测试下运行它将打印名为
模拟构造函数

如果我理解正确,您希望使用模拟构造函数测试类。这不是一种好的测试方法,因为您没有以最纯粹的形式测试生产代码。
我完全不同意。单元测试(白盒测试——JMockit的用途)最纯粹的形式是测试单个单元。如果您正在测试一个不是复杂构造函数的特定单元,那么允许它执行就是黑盒测试,这在您尝试进行单元测试时是非常糟糕的。但是在模拟构造函数时(在$init()方法内)如何设置对象的字段呢?它与模拟构造函数配合得很好。当我创建一个类的新实例时,如何返回另一个现有对象?有人说关于“magic'it'属性”,JMockit项目页面的链接已关闭。
// srce/test/java/pkg/SomeTest.java
import org.junit.Test;

public class SomeTest {

    @Test
    public void test() {
        new SomeMock();
        new SomeClass("a", 2);
    }

}