2017-12-20 28 views
1

다른 추상 클래스 A를 확장하는 추상 클래스 B가 있습니다. 추상 클래스 A에서 메소드 변환을 보호했습니다. 구현이없는 기본 클래스에서 메서드 변환을 호출하는 foo 메서드를 테스트하고 싶습니다. 변환 방법 서명을 변경할 수없는 경우 어떻게 모의 메서드를 변환 할 수 있습니까?다른 클래스를 확장하는 테스트 추상 클래스

abstract class B extends A { 
    public void foo(Object someObject) { 
     Object convertedObject = convert(someObject); 
     //logic for testing 
    } 
} 

abstract class A { 
    protected abstract Object convert(Object some object);  
} 

나는 실제 메소드를 호출하기위한 Mockito.spy()를 사용하지만 Mockito.when (...) throught를 (조롱하기위한 방법은 사용할 수 없습니다 변환합니다. thenReturn (...)를이 보호되기 때문이다.

B b = Mockito.spy(B.class); 

것은 나에게 내가 방법 foo를 테스트 할 수있는 방법 아이디어를 제공합니다.

+1

비 추상적 인 하위 클래스를 통해 테스트하십시오. 그것을 테스트하기 위해 B의 인스턴스가 필요할 것이다.하지만 추상이기 때문에 B를 인스턴스화 할 수 없다. – Stultuske

+0

[클래스 테스트를 어떻게 추상 클래스 단위로 확장 할 것인가?] (https://stackoverflow.com/questions/)의 가능한 복제본 243274/how-to-unit-test-abstract-classes-with-stubs) – LenglBoy

+0

당신은 PowerMockito를 사용해야한다. – pvpkiran

답변

0

Mockito이 추상 클래스를 조롱 수 없습니다. 그러나 당신이 당신의 클래스 B을 구현 한 후 감시 테스트하기위한 목적으로 서브 클래스를 가질 수 있습니다.

@RunWith(MockitoJUnitRunner.class) 
public class BTest { 

    @InjectMocks 
    @Spy 
    private FakeB b; 

    @Test 
    public void testSomething() { 
     when(b.convert(any())).thenReturn(something); 
    } 

    public static class FakeB extends B { 
     protected Object convert(Object someobject) { 
      return null; 
     } 
    } 
} 

이 방법을 사용하면 추상 메소드를 쉽게 모방하고 추상 클래스에서 비 추상적 인 메소드를 테스트 할 수 있습니다. 물론 단점은 추상 클래스의 하위 유형 인 가짜 테스트 클래스를 작성해야한다는 것입니다. 하지만 큰 문제는 아닌 것으로 생각합니다.