2011-09-28 2 views
9

나 자신에게 가르치려고 애 쓰고 Mockito.모 킷토 "언제"문제가

정말 생각 내 방식으로 실행하지 않아야 다음과 같은 방법 hasInventory()을 고려하지만, 사실 또는 거짓 내가으로 농형 내 테스트를 반환하도록 설정하세요. 클래스 웨어 하우스은 "mocked-dependency"입니다. JUnit 테스트 코드

public class Warehouse implements IWarehouse 
{ 
    private Map< String, Integer > inventory; 

    public Warehouse() 
    { 
    this.inventory = new HashMap< String, Integer >(); 
    } 

    public final boolean hasInventory(String itemname, int quantity) 
     throws InventoryDoesNotExistException 
    { 
    if(inventory == null) 
     throw new InventoryDoesNotExistException(); 

    if(!inventory.containsKey(itemname)) 
     return false; 

    int current = (inventory.containsKey(itemname)) ? inventory.get(itemname) : 0; 

    return(current >= quantity); 
    } 
    ... 

, 제 ()는 그대로 메소드 호출 (이를 실행)와, 재고되는 무 (상기 참조)를 해석하기 때문에 예외를 발생, InventoryDoesNotExistException 인 던져. mocked-dependency 클래스에는 다른 메소드가 있습니다. 예를 들어, add()remove()과 같은 것입니다.() 방법은, 내가 정확하게) (을 hasInventory를 호출하지 않는,하지만 그냥은 내가 테스트로 불리는 대신 때마다 사실을 반환 Mockito 부탁 해요 때

@RunWith(MockitoJUnitRunner.class) 
public class OrderInteractionTest 
{ 
    private static final String TALISKER = "Talisker"; 
    private Order systemUnderTest = null; 

    @Mock 
    private Warehouse mockedDependency = null; 

    @Before 
    public void init() 
    { 
    //MockitoAnnotations.initMocks(this); 
    //mockedDependency = mock(Warehouse.class); 
    this.systemUnderTest = new Order(TALISKER, 50); 
    } 

    @Test 
    public void testFillingRemovesInventoryIfInStock() 
    { 
    try 
    { 
     doNothing().doThrow(new RuntimeException()).when(mockedDependency).add(anyString(), anyInt()); 
     doNothing().doThrow(new RuntimeException()).when(mockedDependency).remove(anyString(), anyInt()); 
     when(mockedDependency.hasInventory(anyString(), anyInt())).thenReturn(true); 
     when(mockedDependency.getInventory(anyString())).thenReturn(50); 

은 내가 에 의해, 그것을 알고있는 것처럼 클래스 ("systemUnderTest"). 누구든지 내가이 시점을 지나서 도울 수 있을까?

나는이 글을 읽을 모든 사람에게 4.

새빨간 감사 mockito 모두-1.8.5.jar를 연결하고 JUnit을하고있다.

러스

답변

10

Mockito는 final 클래스 또는 메소드를 모의 할 수 없다. hasInventory 메서드에서 final 수정자를 제거해보십시오. 아니면 Warehouse 클래스를 조롱하지 말고 IWarehouse 인터페이스를 조롱하세요. 메서드는 final 일 수없고 아마도 Order에 의해 사용되는 메서드를 정의합니다.

일반적으로 인터페이스를 모방하는 것이 바람직하지만 필수는 아닙니다.

모크토 FAQ에서 final 클래스 또는 메소드를 모의 할 수 없다는 것은 Mockito 에서 간략하게 언급되었지만 모의 객체를 생성하는 데 사용되는 런타임 클래스 생성 기술 때문입니다.

+0

하! 네, 그게 문제입니다. 사실, 오늘 일찍이 이것에 대해 읽었습니다.하지만 저는 연결하지 않았습니다. 다른 튜토리얼의 모방에서 나는 IWarehouse를 모의하기 시작했고 그게 작동하고 있었기 때문에 인터페이스 만 조롱 할 수 있다고 생각 했었습니다. (몇 주 전 누군가에게 간단한 수업을 조롱 할 수 있다고 말했기 때문에 시도하지 않았습니다. 많은 실생활 시나리오에서 생각한 인터페이스를 모의하기 위해서, 나는 인터페이스조차 갖지 못했다.) 그러나 이것은 올바른 대답입니다! 이것 대단히 감사합니다. –

관련 문제