2013-08-30 25 views
10

私は、(たくさんのパラメータを持つ)複雑なコンストラクタを持つクラスをユニットテストしています。コンストラクタは次のような3つの引数をとります。JMockitモックコンストラクタ

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

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

コンストラクタは、さらに複雑なスーパーコンストラクタを呼び出します。 JMockitを使用して、実際にコンストラクタを呼び出さずに、クラスのインスタンスを作成してメソッドをテストするにはどうすればよいですか?私はJMockitに新しいです、どんな助けも高く評価されます。

ありがとうございます!

答えて

12

私が正しく理解していれば、模擬したコンストラクタを使ってクラスをテストしたいと思っています。これは、純粋な形式で実動コードをテストしていないため、テストするのには適していません。

しかし、すべてがルールに従っているわけではありませんか? :)あなたが主張するなら、JMockItはあなたにこれをさせるでしょう。コンストラクタだけを模擬して他のメソッドをテストすることができます。 Mockingコンストラクタは、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

関連する問題