2016-04-27 2 views
0

ich den Code unten haben:Mockito Rückgabewert für bestimmte Objekte und werfen für alle anderen Objekt gleichen Typs

private SaveTransactionClient mockedTransactionClient; 

private static Publisher publisher; 

private static MyDTO mDTO1; 
private static MyDTO mDTO2; 
private static MyDTO mDTO3; 

@BeforeClass 
public void setUp() throws IOException { 
    TransactionResponse successResponse = new TransactionResponse(); 
    successResponse.setDateRequest("2016-04-27 18:47:50"); 
    successResponse.setResponse("OK"); 
    successResponse.setTransactionNumber("1"); 

    TransactionResponse failedResponse = new TransactionResponse(); 
    failedResponse.setDateRequest("2016-04-27 18:47:50"); 
    failedResponse.setResponse("Dublicate Transaction Error"); 
    failedResponse.setTransactionNumber("1"); 

    mDTO1 = new MyDTO(1, LocalDateTime.now(), 0); 
    mDTO2 = new MyDTO(2, LocalDateTime.now(), 0); 
    mDTO3 = new MyDTO(3, LocalDateTime.now(), 0); 

    mockedTransactionClient = mock(SaveTransactionClient.class); 

    when(mockedTransactionClient.sendTransactionRequest(mDTO1)).thenReturn(successResponse); 
    when(mockedTransactionClient.sendTransactionRequest(mDTO2)).thenReturn(failedResponse); 
    when(mockedTransactionClient.sendTransactionRequest(mDTO3)).thenThrow(new IOException()); 
    when(mockedTransactionClient.sendTransactionRequest(any(MDTO.class))).thenThrow(new IOException()); 


    publisher = new publisherImpl(mockedTransactionClient); 
} 

Die eigentlichen Tests sind

@Test 
public void TestOnlyExceptionalPublishing() { 
    BlockingQueue<MDTO> mDTOs = new LinkedBlockingQueue<>(Arrays.asList(mDTO3)); 
    assertEquals(mDTOs.size(), 1); 

    List<MDTO> successful = publisher.publish(wDTOs); 

    assertEquals(successful.size(), 0); 
} 

@Test 
public void TestOneSuccessContainsExceptionalPublishing() { 
    BlockingQueue<MDTO> mDTOs = new LinkedBlockingQueue<>(Arrays.asList(mDTO3,mDTO1, mDTO2)); 
    assertEquals(mDTOs.size(), 3); 

    List<MDTO> successful = publisher.publish(mDTOs); 

    assertEquals(successful.size(), 1); 
} 

Nun ist die MDTO ist unveränderlich und die Art und Weise Die publisher.publish(mDTO) funktioniert ist, dass auf Ausnahme erhöht einen "Wiederholungen" Zähler in MDTO und versuchen Sie es bis zu 3 mal. Wenn der Zähler inkrementiert wird, wird ein neuer MDTO generiert, der mit der Antwort nicht, die von Mockito stubbed ist, ein Problem für mich erstellt. Ich fügte die any hinzu, aber dies macht die anderen Tests fehlgeschlagen, da es für alle und nicht für andere außer für die Objekte, die ich bereits geliefert habe, wirft.

Gibt es eine anyOther Art der Art, dies in Mockito zu tun?

Antwort

1

Ich denke, (wenn ich das richtig verstanden habe), die Sie suchen doAnswer/thenAnswer:

when(mockedTransactionClient.sendTransactionRequest(any(MyDTO.class)).thenAnswer(new Answer<TransactionResponse>() { 
    @Override 
    public TransactionResponse answer(final InvocationOnMock invocation) { 
     final MyDTO arg = invocation.getArgumentAt(0, MyDTO.class) 
     // do stuff here based on arg 
     return someTransactionResponse; // or throw some exception 
    } 
}); 
+0

Es sagt über void-Methode stechend. Ich möchte diktieren, was Mockito zurückgeben sollte, wenn das Methodenargument der verspotteten Klasse nicht eines der drei ist, die ich bereits angegeben habe. – idipous

+0

lesen Sie das Beispiel erneut, im verknüpften Dokument, was Sie zurückgeben * wird zurückgegeben * –

+0

Ja Ihr Beispiel macht es klarer wird es jetzt versuchen – idipous

Verwandte Themen