我有一个错误控制器(用于处理路径“ / 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配置(即代码)正确。
答案 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.
}
}