Модульный тест для совета контроллера без вызова контроллера - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь написать модульный тест для controllerAdvice, все примеры, которые я видел в сети, относятся к интеграционному тесту, это означает, что они вызывают свой основной контроллер Rest, и я не хочу делать таким образом.Вот тест, который я пытаюсь написать:

public class ExceptionTest {

    private MockHttpServletRequest servletRequest;

    private MockHttpServletResponse servletResponse;

    @Before
    public void setup() {
        this.servletRequest = new MockHttpServletRequest("GET", "/");
        this.servletResponse = new MockHttpServletResponse();
 }


    @Test
    public void controllerAdviceExceptionHandlerExceptionResolverTest () throws UnsupportedEncodingException {


        StaticWebApplicationContext ctx = new StaticWebApplicationContext();
        ctx.registerSingleton("exceptionHandler", MyControllerAdvice.class);
        ctx.refresh();

        ExceptionHandlerExceptionResolver resolver = createExceptionResolver();
        resolver.setApplicationContext(ctx);

        ServletRequestBindingException ex = new ServletRequestBindingException("message");
        Assert.assertNotNull(resolver.resolveException(this.servletRequest, this.servletResponse, null, ex));

    }

    private ExceptionHandlerExceptionResolver createExceptionResolver() {
        ExceptionHandlerExceptionResolver exceptionResolver = new ExceptionHandlerExceptionResolver() {
            protected ServletInvocableHandlerMethod getExceptionHandlerMethod(HandlerMethod handlerMethod, Exception exception) {
                Method method = new ExceptionHandlerMethodResolver(MyControllerAdvice.class).resolveMethod(exception);
                return new ServletInvocableHandlerMethod(new MyControllerAdvice(), method);
            }
        };
        exceptionResolver.afterPropertiesSet();
        return exceptionResolver;
    }

Моя проблема в том, что resolver.resolveException (this.servletRequest, this.servletResponse, null, ex) возвращает ноль, но не должно!есть идеи?

1 Ответ

0 голосов
/ 16 апреля 2019

Чтобы решить мою проблему, я создал поддельный контроллер, который вводит данное исключение и выдает его ..

@Controller
class MockedTestController {

    private Throwable exception;

    void setException(Throwable exception) {
        this.exception = exception;
    }

    @GetMapping
    public void handle() throws Throwable {
        if (this.exception != null) {
            throw this.exception;
        }
    }
}

чем я настроил свой юнит-тест следующим образом:

@Before
public void setup() {
    mockMvc = MockMvcBuilders.standaloneSetup(controller)
            .setControllerAdvice(cspControllerAdvice)
            .build();
}

тест может быть следующим:

@Test
public void given_MyException_return_Error_with_values() throws Exception {

    controller.setException(new MyException(""));
    assertExceptionHandler(....);

}

, где

private void assertExceptionHandler(...) throws Exception {
    mockMvc.perform(MockMvcRequestBuilders.get("/"))
            .andExpect(...);
}
...