2015-12-16 9 views
10

Rozważmy następującą metodę:Jak pozorować wywołanie metody i wartość zwracaną bez uruchamiania metody?

public boolean isACertainValue() { 
     if(context.getValueA() != null && context.getValueA().toBoolean() == true) { 
     if(context.getType() != null && context.getType() == ContextType.certainType) { 
      return true; 
     } 
    } 
    return false; 
} 

nie pisałem tego kodu, to jest brzydki jak cholera, to jest całkowicie nadmiernie skomplikowane, ale mam z nim pracować.

Teraz chcę przetestować metodę, która polega na wywołaniu tej metody.

Myślałem, że mogę sobie z tym poradzić przez:

Mockito.when(spy.isACertainValue()).thenReturn(true); bo to przypadek Chcę przetestować.

Ale to nie działa, ponieważ jest jeszcze wywołanie metody ciało:/

uzyskać nullpointers a raczej coś w rodzaju

misusing.WrongTypeOfReturnValue; Boolean nie może zostać zwrócony przez getValueA(). getValueA() powinien powrócić ZMIENNAa

Więc próbowałem (jako obejście) zrobić:

Mockito.when(contextMock.getValueA()).thenReturn(new ValueA()); i Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType);

ale potem dostaję NullPointer że nie może wydaje się być w stanie do debugowania.

Jak to się robi w tym przypadku?

+1

Dokładnie to robimy, ale może jest tam wartość IN tej wartości, której potrzebujesz dalej w teście, więc powinieneś także wyśmiać zwracany obiekt, a nie tylko zwracać instancja tworzona z (domyślnym) konstruktorem. – Stultuske

Odpowiedz

13

Podczas wywoływania

Mockito.when(spy.isCertainValue()).thenReturn(true); 

przy czym sposób isCertainValue() nazywa uzyskiwanie tutaj. Tak działa Java: aby ocenić argument Mockito.when, wynik spy.isCertainValue() musi zostać oceniony, aby metoda mogła zostać wywołana.

Jeśli nie chcesz, aby tak się stało, można użyć the following construct:

Mockito.doReturn(true).when(spy).isCertainValue(); 

ten będzie miał ten sam efekt szyderczy ale metoda nie zostanie wywołana z tym.

+0

Dziękuję, jestem bardziej na dobrej drodze ... Dostaję nullpointer tho xD Nienawidzę tego programu tak bardzo, to jest obrzydliwość: X – Sorona

+0

Uszkodzony link. Gdzie skonfigurowałeś szpiega? – powder366

+0

To zadziałało dla mnie. Przestał rzucać NPE. Dzięki, Tunaki! – Dish

0

Ten kod jest poprawny:

Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType); 

Ale otrzymujesz NullPointerException ponieważ nie określają wartości, które powinny być Mocking definiuje, dobrze Używam Spring, w moim pliku kontekstowego kiedy zdefiniować @Autowired fasolę definiuję to w ten sposób:

<bean id="contextMock" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="com.example.myspringproject.bean.ContextMock" /> 
</bean>