수퍼클래스 구현을 유지하면서 하위 클래스 메서드 모의
널리 사용되는 Java 모의 프레임워크인 Mockito는 종종 특정 메서드를 선택적으로 모의해야 하는 문제에 직면합니다. 클래스 계층 내에서. 이 문서에서는 슈퍼클래스에서 상속된 메서드에 대한 호출만 모의하려는 시나리오를 다룹니다.
문제 설명
다음 클래스 구조를 고려하세요.
<code class="java">class BaseService { public void save() {...} } public Childservice extends BaseService { public void save(){ //some code super.save(); } } </code>
단위 테스트에서는 ChildService의 구현에 영향을 주지 않고 super.save()에 대한 두 번째 호출만 모의 처리할 수 있습니다.
해결책
일반적으로 테스트 목적으로 기존 클래스 계층 구조를 리팩토링하는 것은 권장되지 않지만, 코드베이스를 수정하지 않고 이 문제를 해결할 수 있는 방법이 있습니다.
다음 접근 방식을 고려하세요.
<code class="java">class BaseService { public void validate(){ fail(" I must not be called"); } public void save(){ //Save method of super will still be called. validate(); } } class ChildService extends BaseService{ public void load(){} public void save(){ super.save(); load(); } } @Test public void testSave() { ChildService classToTest = Mockito.spy(new ChildService()); // Prevent/stub logic in super.save() Mockito.doNothing().when((BaseService)classToTest).validate(); // When classToTest.save(); // Then verify(classToTest).load(); }</code>
이 솔루션은 다음을 활용합니다. Mockito의 Mockito.spy() API는 ChildService 클래스의 인스턴스를 래핑합니다. 그런 다음 Mockito.doNothing()을 사용하여 BaseService(수퍼클래스)의 verify() 메서드를 재정의합니다. 이렇게 하면 테스트 중에 유효성 검사()의 논리를 피할 수 있습니다. 결과적으로 ChildService.save()의 실제 구현이 호출되는 반면 super.save()에 대한 호출은 효과적으로 스텁됩니다.
추가 참고 사항
이것은 외부 메서드를 스터빙하거나 조롱하면 테스트가 취약해지고 테스트 결과의 정확성에 영향을 줄 수 있으므로 기술을 자제해서 사용해야 합니다. 그러나 클래스 계층 구조를 리팩토링하는 것이 옵션이 아닌 경우에는 실용적인 솔루션이 될 수 있습니다.
위 내용은 Mockito에서 슈퍼클래스 구현을 유지하면서 서브클래스 메서드를 모의하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!