2016-07-28 14 views
5

Wir haben einen REST-Endpunkt (JAX-RS), der vom Browser aufgerufen wird. Wir geben OutputStream weiter, damit der Browser das Ergebnis des Aufrufs anzeigen kann.Wie testen wir diesen Lambda-Ausdruck?

Hier ist die Methode.

@Path("/mypath/{userId}") 
@POST 
public Response createUser(@PathParam("userId") final int userId) { 
    StreamingOutput stream = (outputStream) -> { 
     User user = userHelper.findUser(userId); 
     userHelper.updateUser(user,outputStream); 
    }; 

    return Response.ok(stream).build(); 
} 

mit JUnit und Mockito, wie überprüfen wir, ob userHelper.findUser und userHelper.updateUser hat genannt?

Im Grunde wollen wir nur die Interaktionen verifizieren.

+1

Sie müssen einen Mock von userHelper injizieren. Hast du schon ein TestCase erstellt? – Fildor

+0

Ja. Das funktioniert nicht. Interaktion findet nicht statt, weil es sich um einen Lambda-Ausdruck handelt. – vinoth

+1

, so sollte Ihr Test eine Interaktion auslösen und dann einen Schein überprüfen –

Antwort

0

Der StreamingOutput wird nur aufgerufen, wenn jemand am anderen Ende (normalerweise der Browser) beginnt, von ihm zu ziehen. Ihr Testfall muss übernehmen und (wie von den Kommentaren vorgeschlagen) die Interaktion mit der Antwort beginnen.

2

Um dies zu testen, sollten Sie Ihre Testklasse erstellen und eine neue Instanz der Klasse erstellen, zu der diese Methode in der Testklasse gehört. Der userHelper ist nicht im Lambda definiert, also ist es ein Klassenmitglied? Wenn ja, können sie spotten:

  • erstellen mock userhelper Objekt mit Mockito
  • inject das Mock auf Ihre Testklasse.
  • Rufen Sie die createUser-Methode auf.
  • verify auf dem Schein zu bestätigen, die updateUser-Methode wird einmal aufgerufen.
  • Sie können einen Schritt weiter gehen und überprüfen, welche Benutzer- und outputStream-Objekte mit captors übergeben werden.