2017-02-21 19 views
4

나는 Availability.java이라는 클래스가 있으며 두 가지 방법이 있습니다.Mockito - 내부 메서드 호출

public Long getStockLevelStage() { 
    //some logic 
     getStockLevelLimit(); 
    } 

    public Long getStockLevelLimit() { 
     String primaryOnlineArea = classificationFeatureHelper.getFirstFeatureName(productModel, FEATURE_CODE_PRODUCT_ONLINE_AREA_PRIMARY, language); 
................ 
     return new Long(); 
    } 

단위 테스트 클래스 AvailabilityTest.java을 쓰고 있습니다.

@RunWith(MockitoJUnitRunner.class) 
public class AvailabilityTest { 
    @InjectMocks 
    private Availability availability = new Availability(); 

    @Test 
    public void testGetStockLevelStage() { 
    availability.getStockLevelStage(); 
    } 
} 

내가 availability.getStockLevelStage() 메소드를 호출

, 그것은 getStockLevelLimit() 메소드를 호출합니다. 내부 메소드 호출을 조롱하는 것이 가능합니까?

getStockLevelStage()이 실행되면이 경우에는 getStockLevelLimit()을 실행하고 싶지 않습니다.

도와주세요.

답변

4

getStockLevelLimit() 경우, 당신이 테스트중인 클래스를 조롱하려는 어떤 식 으로든 의미한다.
이렇게하면 테스트 된 동작의 관련성과 신뢰성이 떨어집니다.

테스트 된 클래스의 내부 메소드가 아니라 종속성을 조롱해야합니다.
격리하려는 외부 종속성 또는 이와 유사한 것을 사용하기 때문에 getStockLevelLimit()을 실행하지 않으려한다고 가정합니다.
getStockLevelLimit() 뒤에있는 모의하고 고립시켜야하며 이는 Availability 클래스의 일부가 아닙니다.

+0

만약 내가 올바르게 이해, 우리는 내부 메서드 호출을 모의 수 없습니다. 맞지? – user2057006

+0

시험을 마칠 방법이없는 경우에만해야합니다. 코드는 자연스럽게 테스트 할 수 있도록 설계되어야합니다. 테스트중인 인스턴스의 비공개 메소드를 조롱하는 것은 당연한 일입니다. – davidxxx

+0

getStocklevelLimit() 메서드를 다른 클래스로 이동하고 조롱하는 옵션이 없습니다. 다른 동료가 작성한 현재 코드에는 몇 가지 제한 사항이 있습니다. 당신이 말했듯이 그것을하는 방법이 있습니다. 내가 게시 한 현재 코드로 제안 해 주시겠습니까? – user2057006

3

이 시도 : 테스트 중에 실행하지가

@RunWith(MockitoJUnitRunner.class) 
public class AvailabilityTest { 
    @InjectMocks 
    @Spy 
    private Availability availability = new Availability(); 

    @Test 
    public void testGetStockLevelStage() { 
     Mockito.doReturn(expectedLong).when(availability).getStockLevelLimit(); 
     availability.getStockLevelStage(); 
    } 
} 
+0

나는 무효화 된 방법에 대해서만 효과가 있다고 생각합니다. 하지만 내 getStockLevelLimit() 메서드는 Long을 반환합니다. void 메소드 만이 아무것도 할 수 없다! doNothing()의 올바른 사용 예제 : doNothing(). doThrow (new RuntimeException()) .when (모의) .someVoidMethod(); 위의 의미 : someVoidMethod()는 처음에는 아무 것도하지 않지만 두 번째 시간에는 예외가 발생합니다 – user2057006

+0

올바른 ... doReturn을 사용해야합니다 .. 최근에 많은 테스트를하던 중 죄송합니다. 예제에 100 %주의를 기울이지 않았습니다. –

+0

문제 없습니다. 귀하의 응답을 주셔서 감사합니다 – user2057006