2013-08-30 154 views
10

我正在测试一个具有复杂构造函数(有很多参数)的类。构造函数有三个参数,如:JMockit模拟构造函数

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

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

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

谢谢!

回答

12

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

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

+0

感谢您的回答。我会试试看。 – userx

+0

'如果我已经正确理解了你,你想用模拟的构造函数测试一个类。这不是测试的好方法,因为您不是以最纯粹的形式测试生产代码。“我完全不同意。以最纯粹的形式进行单元测试(白盒测试 - 这就是JMockit的用处)是测试单个单元。如果您正在测试一个不是复杂构造函数的特定单元,那么允许它执行的是黑盒测试,当您尝试进行单元测试时,这是非常糟糕的。 – searchengine27

+0

但是如何在模拟你的构造函数时(在$ init()方法内)设置对象的字段? – supertonsky