简体   繁体   中英

How do we unit test this lambda expression?

We have a REST end point (JAX-RS) that is invoked from the browser. We are passing around OutputStream so that we could have the browser display the result of the call.

Here is the method.

@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();
}

Using Junit and Mockito, how do we verify if userHelper.findUser and userHelper.updateUser has been called ?

Basically we just want to verify the interactions.

To "unit" test this you should create your test class and create a new instance of the class this method belongs to in the test class. The userHelper is not defined in the lambda so it is a class member? If so it can be mocked:

  • Create a mock userhelper object with Mockito
  • inject the mock to your test class.
  • Call the createUser method.
  • verify on the mock to assert the updateUser method is called once.
  • You can go a step further and verify what user and outputStream objects are passed using captors .

The StreamingOutput is only called when somebody on the other end (typically the browser) start pulling from it. You test case will need to take over and (as suggested by the comments) start interaction with the Response.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM