package de.codecentric.mjl.jerseytest;
import javax.ws.rs.core.Context;
import javax.ws.rs.ext.Provider;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.internal.util.reflection.Whitebox;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.ClientResponse.Status;
import com.sun.jersey.api.core.ClassNamesResourceConfig;
import com.sun.jersey.spi.container.servlet.WebComponent;
import com.sun.jersey.spi.inject.SingletonTypeInjectableProvider;
import com.sun.jersey.test.framework.JerseyTest;
import com.sun.jersey.test.framework.WebAppDescriptor;
import com.sun.jersey.test.framework.spi.container.TestContainerFactory;
import com.sun.jersey.test.framework.spi.container.grizzly2.web.GrizzlyWebTestContainerFactory;
import de.codecentric.mjl.jerseytest.client.TodoClient;
import de.codecentric.mjl.jerseytest.exceptions.TodoNotFoundException;
import de.codecentric.mjl.jerseytest.providers.NotFoundMapper;
import de.codecentric.mjl.jerseytest.resources.TodoResource;
import de.codecentric.mjl.jerseytest.services.TodoService;
public class TodoResourceTest extends JerseyTest {
public static TodoService todoServiceMock = Mockito.mock(TodoService.class);
@Override
public WebAppDescriptor configure() {
return new WebAppDescriptor.Builder()
.initParam(WebComponent.RESOURCE_CONFIG_CLASS,
ClassNamesResourceConfig.class.getName())
.initParam(
ClassNamesResourceConfig.PROPERTY_CLASSNAMES,
TodoResource.class.getName() + ";"
+ MockTodoServiceProvider.class.getName() + ";"
+ NotFoundMapper.class.getName()).build();
}
@Override
public TestContainerFactory getTestContainerFactory() {
return new GrizzlyWebTestContainerFactory();
}
@Before
public void resetMocks() {
// the mock is stored in a static field and must be reset manually before each test
Mockito.reset(todoServiceMock);
}
@Test(expected = TodoNotFoundException.class)
public void removeTodoShouldThrowNotFoundException() {
final String todo = "test-todo";
Mockito.doThrow(new TodoNotFoundException()).when(todoServiceMock).removeTodo(todo);
todoClient().removeTodo(todo);
}
@Test
public void shouldReturn400OnNotFoundException() {
String todo = "test-todo";
Mockito.doThrow(new TodoNotFoundException()).when(todoServiceMock).removeTodo(todo);
ClientResponse response = resource().path("todo/" + todo).delete(ClientResponse.class);
Assert.assertEquals(Status.BAD_REQUEST, response.getClientResponseStatus());
Assert.assertEquals("TodoNotFoundException", response.getEntity(String.class));
}
private TodoClient todoClient() {
TodoClient todoClient = new TodoClient(getBaseURI().toString());
Whitebox.setInternalState(todoClient, "client", client());
return todoClient;
}
@Provider
public static class MockTodoServiceProvider extends
SingletonTypeInjectableProvider<Context, TodoService> {
public MockTodoServiceProvider() {
super(TodoService.class, todoServiceMock);
}
}
}