2016-03-31 14 views
7

Qual è la differenza tra doThrow() e thenThrow()?Mockito: Differenza tra doThrow() e thenThrow()

Diciamo che vogliamo prendere in giro un servizio di autenticazione per convalidare le credenziali di accesso di un utente. Qual è la differenza tra le seguenti due righe se dovessimo prendere in giro un'eccezione?

doThrow(new BadCredentialsException("Wrong username/password!")).when(authenticationService).login("user1", "pass1"); 

vs

when(authenticationService.login("user1", "pass1")).thenThrow(new BadCredentialsException("Wrong username/password!")); 

risposta

13

Quasi nulla: nei casi più semplici si comportano esattamente lo stesso. La sintassi when si legge più come una frase grammaticale in inglese.

Perché "quasi"? Si noti che lo stile when contiene effettivamente una chiamata a authenticationService.login. Questa è la prima espressione valutata in quella linea, quindi qualunque comportamento tu abbia stubato avverrà durante la chiamata a when. La maggior parte delle volte, non ci sono problemi qui: la chiamata al metodo non ha alcun comportamento di stub, quindi Mockito restituisce solo un valore fittizio e le due chiamate sono esattamente equivalenti. Tuttavia, questo potrebbe non essere il caso se uno dei seguenti sono vere:

  • si sta ignorando comportamento che già spense, in particolare per l'esecuzione di una risposta o lancerà un'eccezione
  • si sta lavorando con una spia con un'implementazione non banale

In questi casi, doThrow chiamerà when(authenticationService) e disattivare tutti i comportamenti pericolosi, mentre when().thenThrow() sarà richiamare il metodo pericoloso e buttare fuori il vostro test.

(Naturalmente, per i metodi vuoti, avrete anche bisogno di utilizzare doThrow -la when sintassi non compilerà senza un valore di ritorno. Non c'è altra scelta lì.)

Così, doThrow è sempre un po ' di norma più sicuro, ma lo when().thenThrow() è leggermente più leggibile e di solito equivalente.

+0

Ho pensato che il motivo principale per 'doThrow (...). Quando (...)' era per i metodi che non restituiscono un valore – BretC

+0

@BretC Sì, doVerb funziona per lo stub dei metodi void, ma non c'è nulla di sottile quella; 'when' semplicemente non verrà compilato. Mi sono concentrato sulle differenze più sottili mentre vedo molte domande correlate. Grazie allo stesso modo, modificherò. –