2012-01-06 8 views
23

Я хочу проверить некоторые методы, которые вызывают другие в том же классе. Это в основном те же методы, но с меньшими аргументами, поскольку в базе данных есть значения по умолчанию. Я показываю на этомКак проверить, был ли метод вызван из другого с тем же классом 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; 
    } 
} 

Так я хочу испытание, если был вызван метод getPriceForOne() при вызове метода getPrice (INT). В основном вызывают обычный метод getPrice (int) и mock 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

То, что вы хотите частичное насмешливый, но не рекомендуется, Mockito фактически отвратить это при исключении некоторых конкретных случаев. Если это класс утилиты, имеет смысл полностью протестировать каждый метод. Если это не так, т. Е. Требует сложной обработки, вы можете захотеть создать свой код с композицией. – Brice

ответ

38

Вы должны были бы шпионом, а не макет A:

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

Что такое ** getPriceForOne ** должен иметь некоторые произвольные параметры? –

+0

, то вы просто добавляете 'any (YourObject.class)' в качестве параметра для 'getPriceForOne' – TormundThunderfist

+0

Выполнение этого действия. В то же время, если ваш «шпионский» класс имеет частные переменные для установки, также необходимо установить этот класс с использованием метода Whitebox.setInternalState(). – udayanga