Attila は、ほとんどの場合に適しています。あなたがテストしたいのは、 create がどのように行うかではなく、実際に行うべきだと思うことを行うことです。ここにあるケースは、「baseCreate が自分のやりたいことを実行することは既にわかっているので、それを再テストしたくはありません。単に呼び出されることだけです。」のように聞こえます。これは事実かもしれませんが、もしそうなら、あなたのスーパークラスは本当に協力者です. これは、継承よりも委譲を優先する理由の一部です。とはいえ、設計上の決定に戻って変更するのが難しい場合もあるため、既存のものをテストする必要があります。
「作成」が全体としてやりたいことを実行することを確認することを引き続き優先する必要がありますが、baseCreate が実際に多くのことを実行していて、コラボレーターなどの多くの設定が必要な場合があるかもしれません。テストが困難で脆い。その場合、「スパイ」を使用する必要があります。スパイは「実際の」オブジェクトをラップし、特に別の期待を作成しない限り、実際のメソッド呼び出しに委任します。
baseCreate を公開できる場合は、次のように Mockito を使用できます。
@RunWith(MockitoJUnitRunner.class)
// We prepare PartialMockClass for test because it's final or we need to mock private or static methods
public class YourTestCase {
@Spy
private Derived classUnderTest = new Derived();
@Test
public void privatePartialMockingWithPowerMock() {
MyObject myObject = new MyObject();
when(classUnderTest.baseCreate(myObject)).thenReturn(myObject);
// execute your test
classUnderTest.create(myObject);
verify(classUnderTest).baseCreate(myObject);
}
}
baseCreate を公開できない場合は、 PowerMockを使用できると思います。プライベート メソッドを検証できますが、保護されたメソッドも実行できない理由はないと思います。
@RunWith(PowerMockRunner.class)
// We prepare PartialMockClass for test because it's final or we need to mock private or static methods
@PrepareForTest(Derived.class)
public class YourTestCase {
@Test
public void testCreate() {
Derived classUnderTest = PowerMockito.spy(new Derived());
MyObject myObject = new MyObject();
// use PowerMockito to set up your expectation
PowerMockito.doReturn(myObject).when(classUnderTest, "baseCreate", myObject);
// execute your test
classUnderTest.create(myObject);
// Use PowerMockito.verify() to verify result
PowerMockito.verifyPrivate(classUnderTest).invoke("baseCreate", myObject);
}
}