2012-01-06 4 views
23

같은 클래스의 다른 메소드를 호출하는 메소드를 테스트하고 싶습니다. 기본적으로 데이터베이스에 몇 가지 기본값이 있기 때문에 기본적으로 같은 방법이지만 인수가 적습니다. 내가 방법 getPriceForOne를 불렀다 그래서 만약 내가 테스트를 원하는이mockito에 의해 같은 클래스의 다른 메소드로부터 메소드가 호출되었는지 확인하는 방법

public class A{ 
    Integer quantity; 
    Integer price;   

    A(Integer q, Integer v){ 
     this quantity = q; 
     this.price = p; 
    } 

    public Float getPriceForOne(){ 
     return price/quantity; 
    } 

    public Float getPrice(int quantity){ 
     return getPriceForOne()*quantity; 
    } 
} 

에 표시() 메소드 getPrice (int)를 호출 할 때. 기본적으로 일반 메소드 getPrice (int) 및 모의 getPriceForOne을 호출하십시오.

import static org.mockito.Mockito.times; 
import static org.mockito.Mockito.verify; 
.... 

public class MyTests { 
    A mockedA = createMockA(); 

    @Test 
    public void getPriceTest(){ 
     A a = new A(3,15); 
     ... test logic of method without mock ... 

     mockedA.getPrice(2); 
     verify(mockedA, times(1)).getPriceForOne(); 
    } 
} 

나는 훨씬 더 복잡한 파일을 다른 사람을위한 유틸리티라고 생각하고 모두 하나의 파일에 있어야합니다.

+0

당신이 원하는 것은 부분적인 조롱하지만 권장되지 않습니다. 유틸리티 클래스 인 경우 각 메소드를 완전히 테스트하는 것이 좋습니다. 그렇지 않은 경우, 즉 복잡한 처리가 필요하면 대신 컴포지션을 사용하여 코드를 디자인 할 수 있습니다. – Brice

답변

38

당신은 스파이가 아니라 모의 필요합니다 : Mockito 실제로 일부 특수한 경우를 제외에이 낙담

A a = Mockito.spy(new A(1,1)); 
    a.getPrice(2); 
    verify(a, times(1)).getPriceForOne(); 
+0

** getPriceForOne **에는 임의의 매개 변수가 있어야합니까? –

+0

그러면 'getPriceForOne'의 매개 변수로'any (YourObject.class)'를 추가하십시오. – TormundThunderfist

+0

이 작업이 정확합니다. 같은 시간에, 'spyed'클래스가 설정할 개인 변수를 가지고 있다면 Whitebox.setInternalState() 메서드를 사용하여 해당 클래스로 설정해야합니다. – udayanga

관련 문제