【问题标题】:JMockit mock constructorJMockit 模拟构造函数
【发布时间】:2013-09-03 15:20:06
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

    标签: java unit-testing jmockit


    【解决方案1】:

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

    但是,并非一切都按规则进行,不是吗? :) 所以如果你坚持,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

    【讨论】:

    • If I've understood you correctly, you want to test a class with a mocked constructor. This is not a good approach to testing because you aren't testing the production code in its purest form. 我完全不同意。最纯粹的单元测试(白盒测试 - 这是 JMockit 的用途)是测试单个单元。如果您正在测试一个不是复杂构造函数的特定单元,那么允许它执行就是黑盒测试,当您尝试进行单元测试时,这是非常糟糕的。
    • 但是在模拟构造函数时如何设置对象的字段(在 $init() 方法中)?
    • 它与模型构造函数配合得很好。当我新建一个类的实例时,如何返回另一个现有对象?有人说“神奇的‘它’属性”stackoverflow.com/questions/4563584/…
    • JMockit 项目页面的链接失效了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2011-11-24
    • 1970-01-01
    相关资源
    最近更新 更多