How to use mockito for testing a REST service?
java, mockito, rest, unit-testing
Solution
OK. So, the contract of the method is the following: Parse the input string as JSON, and send back `BAD_REQUEST` if it's invalid. If it's valid, create an entity in the `datastore` with various properties (you know them), and send back `OK`.
And you need to verify that this contract is fulfilled by the method.
Where does Mockito help here? Well, if you test this method without Mockito, you need a real `DataStoreService`, and you need to verify that the entity has been created correctly in this real `DataStoreService`. This is where your test is not a unit test anymore, and this is also where it's too complex to test, too long, and too hard to run because it needs a complex environment.
Mockito can help by mocking the dependency on the `DataStoreService`: you can create a mock of `DataStoreService`, and verify that this mock is indeed called with the appropriate entity argument when you call your `initialize()` method in your test.
To do that, you need to be able to inject the `DataStoreService` into your object under test. It can be as easy as refactoring your object in the following way:
public class MyRestService {
private DataStoreService dataStoreService;
// constructor used on the server
public MyRestService() {
this.dataStoreService = DatastoreServiceFactory.getDatastoreService();
}
// constructor used by the unit tests
public MyRestService(DataStoreService dataStoreService) {
this.dataStoreService = dataStoreService;
}
public Response initialize(String DatabaseSchema) {
...
// use this.dataStoreService instead of datastore
}
}
And now in your test method, you can do:
@Test
public void testInitializeWithGoodInput() {
DataStoreService mockDataStoreService = mock(DataStoreService.class);
MyRestService service = new MyRestService(mockDataStoreService);
String goodInput = "...";
Response response = service.initialize(goodInput);
assertEquals(Response.Status.OK, response.getStatus());
ArgumentCaptor<Entity> argument = ArgumentCaptor.forClass(Entity.class);
verify(mock).put(argument.capture());
assertEquals("the correct kind", argument.getValue().getKind());
// ... other assertions
}
Problem
I am very new in Java Unit Testing and I heard that Mockito framework is really good for testing purposes. I have developed a REST Server (CRUD methods) and now I want to test it, but I don't know how? Even more I don't know how this testing procedure should begin. My server should work on localhost and then make calls on that url(e.g. localhost:8888)? Here is what I tried so far, but I'm pretty sure that this isn't the right way. ``` @Test public void testInitialize() { RESTfulGeneric rest = mock(RESTfulGeneric.class); ResponseBuilder builder = Response.status(Response.Status.OK); builder = Response.status(Response.Status.OK).entity( "Your schema was succesfully created!"); when(rest.initialize(DatabaseSchema)).thenReturn(builder.build()); String result = rest.initialize(DatabaseSchema).getEntity().toString(); System.out.println("Here: " + result); assertEquals("Your schema was succesfully created!", result); } ``` Here is the code for `initialize` method. ``` @POST @Produces(MediaType.APPLICATION_JSON) @Path("/initialize") public Response initialize(String DatabaseSchema) { /** Set the LogLevel to Info, severe, warning and info will be written */ LOGGER.setLevel(Level.INFO); ResponseBuilder builder = Response.status(Response.Status.OK); LOGGER.info("POST/initialize - Initialize the " + user.getUserEmail() + " namespace with a database schema."); /** Get a handle on the datastore itself */ DatastoreService datastore = DatastoreServiceFactory .getDatastoreService(); datastore.put(dbSchema); builder = Response.status(Response.Status.OK).entity( "Your schema was succesfully created!"); /** Send response */ return builder.build(); } ``` In this test case I want to send a Json string to the server(POST). If everything went well then the server should reply with "Your schema was succesfully created!". Can someone please help me?