2015-01-14 2 views
0

Я использую mockito для своих тестов, и поэтому я хочу, чтобы макет выполнял инкремент на его AtomicIntegerField, вот упрощенный код.Mockito, как использовать реальные методы и получать значения

public class MockTest { 

    private AtomicInteger ai = new AtomicInteger(0); 

    public int getAi(){ 
    return ai.get(); 
    } 

    public void increment() { 
    ai.getAndIncrement(); 
    } 

    public static void main(String[] args) { 
    MockTest mt = Mockito.mock(MockTest.class, Mockito.RETURNS_DEEP_STUBS); 
    Mockito.when(mt.getAi()).thenCallRealMethod(); 
    Mockito.doCallRealMethod().when(mt).increment(); 
    System.out.println(mt.getAi()); 
    mt.increment(); 
    System.out.println(mt.getAi()); 

    } 
} 

Я попытался Thie CallRealMethod, но я получил NullPointerException, когда выполняется прибудете. Я также читал об использовании объекта «Ответ», но не знаю, что я не уверен в аргументах, которые используют.

+2

Возможно, вам нужен шпион, а не макет. – chrylis

+0

В таком примере вам не кажется, что вам даже нужен макет, вы должны проверить реальный объект! –

ответ

3

Из документации Mockito, , если реальная реализация зависит от конкретного состояния объекта, тогда у вас возникают проблемы. Это именно ваш случай, вы частично издеваетесь над классом MockTest, а затем вызываете метод getAi(), который зависит от состояния clase (ai).

http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html

Как указываются в комментариях, вы можете использовать шпион, хотя, который противоположный подход, вы используете реальный объект и гасите только некоторые методы. В вашем примере неясно, что вы пытаетесь протестировать, но вот как выглядит шпион.

MockTest mt = Mockito.spy(new MockTest()); 

System.out.println(mt.getAi()); 
mt.increment(); 
System.out.println(mt.getAi()); 

// Output will be 
// 0 
// 1 

И потом, если вам нужно гасят, скажем, метод mt.getAi() вы могли бы сделать это следующим образом.

MockTest mt = Mockito.spy(new MockTest()); 
Mockito.when(mt.getAi()).thenReturn(100); 

System.out.println(mt.getAi()); 
mt.increment(); 
System.out.println(mt.getAi()); 

// Output will be 
// 100 
// 100 

Просьба принять во внимание, что частичная издеваться обычно код запах для очень специфических ситуациях, как при работе с унаследованным кодом, который трудно изменить, за исключением.

Надеюсь, это поможет.

Смежные вопросы