2013-08-30 188 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