web-dev-qa-db-ja.com

JMockitモックコンストラクター

私は複雑なコンストラクター(多くのパラメーターを持つ)を持つクラスを単体テストしています。コンストラクターは次のような3つの引数を取ります。

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

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

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

ありがとう!

11
userx

私があなたを正しく理解しているなら、あなたはモックされたコンストラクターでクラスをテストしたいと思うでしょう。実動コードを最も純粋な形式でテストしていないため、これはテストへの適切なアプローチではありません。

しかし、すべてがルールに従っているわけではありませんか? :)それで、あなたが主張するならば、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が出力されます。

15
joescii