JMockit模拟构造函数

13

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

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

    super(webForm, dataEntryModel, obsBatId);
.....

构造函数然后调用一个更复杂的超级构造函数。使用JMockit,我如何在不实际调用构造函数的情况下创建类的实例并测试方法?我对JMockit很陌生,感谢任何帮助。

谢谢!

1个回答

21

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

但是,并不是所有事情都按照规则进行,是吗? :) 所以如果您坚持,JMockIt将让您这样做。您可以仅模拟构造函数并测试其他方法。在JMockIt项目网站上有关于模拟构造函数的文档。

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

生产代码:

// 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


如果我理解你的意思是,您想使用模拟构造函数测试一个类。这不是一个好的测试方法,因为您没有在生产环境下测试代码的最纯净形式。但我完全不同意这一点。单元测试(白盒测试 - 这就是JMockit用于的)的最纯净形式就是测试独立单元。如果您正在测试一个不是复杂构造函数的特定单元,则允许其执行将是黑盒测试,这在您尝试进行单元测试时是极其糟糕的。 - searchengine27
但是,在模拟构造函数时(在$init()方法内部),如何设置对象的字段? - supertonsky
它与模型构造器很好地配合使用。当我创建一个类的新实例时,如何返回另一个现有对象?有人提到了“神奇的'it'属性”https://dev59.com/-VPTa4cB1Zd3GeqPfQKp - Marco Dinh
6
JMockit 项目页面的链接挂了。 - michaelbahr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接