是否可以将ErrorController与@WebMvcTest一起使用?

时间:2018-12-21 18:54:19

标签: spring-boot spring-boot-test

我有一个错误控制器(用于处理路径“ / error”),该错误控制器在应用程序运行时有效,但是在使用@WebMvcTest进行单元测试时,它不起作用。

如果我直接向其路径发送请求,则错误控制器也将起作用。

这是我的错误控制器:

@Controller
public class ErrorController implements org.springframework.boot.web.servlet.error.ErrorController {

    @RequestMapping("/error")
    public ResponseEntity<List<Error>> handleError(HttpServletRequest request) {

这是我的测试课:

@RunWith(SpringRunner.class)
@WebMvcTest({ErrorController.class})
public class ErrorControllerTest {

    @Autowired
    private MockMvc mockMvc;

我还尝试在WebMvcTest批注中添加类ErrorMvcAutoConfiguration。

我已经调试了ErrorMvcAutoConfiguration类,发现在应用程序运行时,它会找到一个错误视图解析器,但是在以单元测试的形式运行时,它找不到任何视图。

此测试背后的想法是确保导致该错误控制器执行的Spring配置(即代码)正确。

1 个答案:

答案 0 :(得分:0)

您没有执行 单元测试 如果希望通过在MyController中调用方法来触发ErrorController。 那是一个集成测试,您不需要这样做。

如果您将测试描述为:“我想看到MyController类的异常落在ErrorController类中”,那么您就没有在测试MyController类或ErrorController类。 相反,您正在测试Spring是否有效。 您不需要测试Spring是否有效。 Spring的作者测试发现Spring可以正常工作。

如果您想测试ErrorController中的注解是否正确,以使Spring在您将ErrorController类定义为错误控制器时将其定义, 那么您就在正确的道路上。 那仍然是集成测试,而不是单元测试。

要对ErrorController类进行单元测试, 只需在单元测试中创建ErrorController类的实例并调用方法。 您可以在单元测试中使用反射来验证注释 “对您来说正确”。 这是一个简单的示例ErrorController单元测试。

public TestErrorController
{
  private ErrorController classToTest;

  @Mock
  private HttpServletRequest mockHttpServletRequest;

  private
  @Before
  public void beforeTest()
  {
    MockitoAnnotations.initMocks(this);

    classToTest = new ErrorController();
  }

  @Test
  public void handleError_allGood_success()
  {
    private ResponseEntity<List<Error>> actualResult;

    // mock the desired mockHttpServletRequest functionality.
    doReturn(something).when(mockHttpServletRequest).someMethod();


    // Perform the test.
    actualResult = classToTest.handleError(mockHttpServletRequest);


    // Do asserts on the actualResult here.
  }
}