2014-10-31 26 views
10

Próbuję zaimplementować Mockito przetestować szczególną metodę ale .thenReturn (...) wydaje się być zawsze wraca do pustego obiektu, zamiast tego, co zamierzałem:Mockito - thenReturn zawsze zwraca null obiekt

CUT:

public class TestClassFacade { 

    // injected via Spring 
    private InterfaceBP bpService; 

    public void setBpService(InterfaceBP bpService) { 

     this.bpService = bpService; 
    } 

    public TestVO getTestData(String testString) throws Exception { 

    BPRequestVO bpRequestVO = new BPRequestVO(); 

    bpRequestVO.setGroupNumber(testString) ; 
    bpRequestVO.setProductType("ALL") ;   
    bpRequestVO.setProfileType("Required - TEST") ; 

    IBPServiceResponse serviceResponse = bpService.getProduct(bpRequestVO); //PROBLEM 

    if (serviceResponse.getMessage().equalsIgnoreCase("BOB")) { 

     throw new Exception(); 

    } else { 

     TestVO testVO = new TestVO(); 
    } 

    return testVO; 
    } 

} 

Wiosna Konfiguracja:

<bean id="testClass" class="com.foo.TestClassFacade"> 

    <property name="bpService" ref="bpService" /> 

</bean> 

<bean id="bpService" class="class.cloud.BPService" /> 

Mockito test metoda: wyjście

@RunWith(MockitoJUnitRunner.class) 
public class BaseTest { 

    @Mock BPService mockBPService; 
    @InjectMocks TestClassFacade mockTestClassFacade; 

    private String testString = null; 
    private BPRequestVO someBPRequestVO = new BPRequestVO(); 
    private IBPServiceResponse invalidServiceResponse = new BPServiceResponse(); 

    @Test (expected = Exception.class) 
    public void getBPData_bobStatusCode_shouldThrowException() throws Exception { 

     invalidServiceResponse.setMessage("BOB"); 

     someBPRequestVO.setGroupNumber(null); 
     someBPRequestVO.setProductType("ALL"); 
     someBPRequestVO.setProfileType("Required - TEST"); 

     System.out.println("1: " + someBPRequestVO.getGroupNumber()); 
     System.out.println("2: " + someBPRequestVO.getProductType()); 
     System.out.println("3: " + someBPRequestVO.getProfileType()); 
     System.out.println("4: " + someBPRequestVO.getEffectiveDate()); 

     when(mockBPService.getProduct(someBPRequestVO)).thenReturn(invalidServiceResponse); 

     mockTestClassFacade.getTestData(testString); 

     verify(mockBPService).getProduct(someBPRequestVO); 
    } 
} 

System:

1: null 
2: ALL 
3: Required - TEST 
4: null 

Co tu się dzieje jest to, że gdy uruchamiam test przedmiotem serviceResponse jest zerowy na linii w CUT oznaczonego // PROBLEM powyżej. Pragnę, aby obiekt ten był wypełniony moim obiektem "invalidServiceResponse" z mojej metody testowej. Sądząc z wyników mojego pliku System.out.println wydaje się, że moje bpRequestVO pasuje do mojego someBPRequestVO w treści.

Czy ktoś może mi pokazać, czego tu brakuje?

Dziękujemy za poświęcony czas!

+0

Najprawdopodobniej to nie pasuje do parametrów do getProduct które ustawiłeś w sobie kiedy (...) z tym, co jest przekazywane w rzeczywistej metodzie. Spróbuj użyć dopasowań, kiedy (service.getProduct (argThat (...)). thenReturn. – LeffeBrune

+2

OP: musisz zaakceptować odpowiedź @ lewthora zamiast tego, myliłem się, nadpisanie '.equals()' wystarczy, nie potrzebujesz argumentu matchera – fge

+0

Dzięki za kontynuację fge ... właśnie przetestowałem go z .equals() i wróciłem do tej strony do upewnij się, że czegoś nie zrozumiałem źle. Rzeczywiście znalazłem twój komentarz! Zmieniłem zaakceptowaną odpowiedź. Dzięki za szczerość. – risingTide

Odpowiedz

8

Wystąpienie BPRequestVO używane z when() jest inne niż wystąpienie w getTestData().
Jeśli nie zastąpisz equals(), nie będą one zgodne.

Nie powinieneś pisać niestandardowego Matchera, jeśli zastępujesz equals(). Zwrócić uwagę na następujące z Mockito documentation.

„dopasowujących argumentów klienta może sprawić, że badanie mniej czytelny Czasami lepiej zaimplementować equals() dla argumentów, które są przekazywane do mocks (Mockito naturalnie wykorzystuje equals() do dopasowywania argument) Może to uczynić test czystszym."

+0

Dzięki lewthor! Dodałem .equals() (i .hashcode) w BPRequestVO i teraz widzę wypełniony obiekt serviceResponse w moim CUT po uruchomieniu mojego testu. – risingTide

4

Problem dotyczy użycia przez użytkownika when().

Przesłanie referencji do skonstruowanej instancji; W wyniku tego, kpiny zwrócą to, co chcesz, tylko jeśli argument przekazany do metody to z tym samym numerem referencyjnym:.

Co chcesz, to argument matcher; coś takiego:

when(mockBPService.getProduct(argThatMatches(someBPRequestVO)) 
    .thenReturn(whatYouWant); 

Oczywiście wymaga to napisania argumentu matchera!

Zauważ, że tam jest wbudowana dopasowujący, który może robić to, co chcesz:

when(mockBPService.getProduct(eq(someBPRequestVO))).thenReturn(whatYouWant); 

Ten układ dopasowujący oczywiście wymaga, aby klasa BPRequestVO realizuje equals() (i hashCode() też)!

1

zamiast tworzyć równy sposób w Ciebie klasie BPRequestVO można utworzyć mock argument z«dowolnego (YourObject.class)»tak:

when(mockBPService.getProduct(any(BPRequestVO.class))).thenReturn(invalidServiceResponse);