私はJUnitでテストしたい、MyClass
という名前のJavaクラスを持っています。私がテストしたいパブリックメソッドmethodA
は、プライベートメソッドmethodB
を同じクラスに呼び出し、どの条件付きパスを従うかを決定します。私の目標は、異なるパスのJUnitテストをmethodA
に書くことです。また、methodB
はサービスを呼び出すため、JUnitテストを実行するときに実際に実行されることは望ましくありません。テスト中の同じクラスのモックプライベートメソッド
methodB
をモックしてその戻り値を制御して、 'methodA'のさまざまなパスをテストできる最良の方法は何ですか?
私はモックを書くときにJMockitを使いたいので、私は特にJMockitに適用されるすべての答えに興味があります。ここで
は私の例のクラスである:
public class MyClass {
public String methodA(CustomObject object1, CustomObject object2) {
if(methodB(object1, object2)) {
// Do something.
return "Result";
}
// Do something different.
return "Different Result";
}
private boolean methodB(CustomObject custObject1, CustomObject custObject2) {
/* For the sake of this example, assume the CustomObject.getSomething()
* method makes a service call and therefore is placed in this separate
* method so that later an integration test can be written.
*/
Something thing1 = cobject1.getSomething();
Something thing2 = cobject2.getSomething();
if(thing1 == thing2) {
return true;
}
return false;
}
}
これは私がこれまで持っているものです。
public class MyClassTest {
MyClass myClass = new MyClass();
@Test
public void test_MyClass_methodA_enters_if_condition() {
CustomObject object1 = new CustomObject("input1");
CustomObject object2 = new CustomObject("input2");
// How do I mock out methodB here to return true?
assertEquals(myClass.methodA(object1, object2), "Result");
}
@Test
public void test_MyClass_methodA_skips_if_condition() {
CustomObject object1 = new CustomObject("input1");
CustomObject object2 = new CustomObject("input2");
// How do I mock out methodB here to return false?
assertEquals(myClass.methodA(object1, object2), "Different Result");
}
}
ありがとう!
を、そのメソッドパッケージプライベートすなわち「デフォルト」のアクセス指定子を作ります。そして私はEasyMock#createMockBuilder()を使って部分模擬を作成し、その私的方法を模擬することができます。あなたのJMockitに相当することは分かりません。 – deepakraut
Easymock-Powermockソリューションに興味がありますか?それ以外の場合は、私はあなたのためにそれを書きたいと思います。 –
も参照してください。http://stackoverflow.com/questions/250692/how-do-you-unit-test-private-methods – Raedwald