아틸라는 대부분의 경우에 적합한 않습니다. 당신이 테스트하기를 원하는 것은 create가 실제로 어떻게해야 하는지를 생각하는 것입니다. 여기있는 경우는 "baseCreate가 내가 원하는 것을 수행한다는 것을 이미 알고 있으므로 다시 테스트하지 않으려 고합니다. 그냥 호출됩니다." 이 은 일 수 있습니다. 그렇다면 슈퍼 클래스는 실제로 공동 작업자입니다. 상속에 대한 위임을 선호하는 이유 중 하나입니다. 그럼에도 불구하고 때로는 돌아가서 디자인 결정을 변경하기가 어렵 기 때문에 가지고있는 제품을 테스트해야합니다.
"create"가 전체적으로 원하는 작업을 수행하는지 확인하는 것이 좋지만 baseCreate가 실제로 많은 공동 작업자 설정을 필요로하는 많은 작업을 수행하는 경우가있을 수 있습니다. 그러한 것은 시험하기가 어렵고 부서지기 쉽다. 이 경우 "스파이"를 사용하고 싶을 것입니다. 스파이는 "실제"객체를 래핑하고 특별히 다른 기대를하지 않는 한 실제 메소드 호출에 위임합니다. 당신이 baseCreate 공개 할 수 있다면
,이 같은 Mockito를 사용할 수 있습니다 : 당신이 baseCreate 공개 할 수없는 경우
@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);
}
}
, 당신이 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);
}
}
안녕하세요 Attila, 답변 주셔서 감사합니다.하지만 TDD로 작성 중이므로 테스트가 실패 할 때만 'Derived'클래스의 구현을 작성해야합니다. 그래서, 그 경우 구현은'return null; '이 될 수 있고 테스트는 여전히 통과 할 것입니다 ... – Noam
'Base.baseCreate()'가 호출 될 때 true 조건을 테스트해야합니다. 그게 아니라면 – Attila