我有以下结构的控制器:
@RequestMapping(value = "${foo.controller.requestMappingUrl.login}", method = RequestMethod.POST)
public ResponseMessage<String> loginUser(
@RequestParam("username") String username, HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
try {
return fooService.login(username); // can mock test
} catch (UserNotFoundException e) {
//CANNOT MOCK TEST THIS BLOCK
String errorMsg = LoggerUtil.printStackTrace(e);
LOG.error("[RequestId: {}] UserNotFoundException: {}, Stack: {}", requestId, e.getMessage(), errorMsg);
httpServletResponse.setStatus(HttpStatus.NOT_ACCEPTABLE.value());
statusCode = StatusCode.UserNotFound.value();
responseMessage.buildResponseMessage(StringUtils.EMPTY, HttpStatus.NOT_ACCEPTABLE, statusCode,
messageByLocaleService.getMessageResponse(statusCode, null, locale));
}
}
当我模拟抛出异常UserNotFoundException时,我只得到NestedServletException。即使我尝试添加expected=NestedServletException.class。corbetura报告指出测试中没有覆盖代码块。您有什么建议来帮助测试catch块内的代码吗。
请求的测试代码:
@SuppressWarnings("unchecked")
@Test(expected = UserNotFoundException.class)
public void testControllerUserNotFoundException() throws Exception {
Response resp = new Response();
resp.setStatusCode(StatusCode.UserNotFoundErrorCode);
when(fooService.login(any(String.class)).thenThrow(UserNotFoundException.class);
mockMvc.perform(post("/service-user/1.0/auth/login?&username=test")
.contentType(contentType)).andExpect(status().isNotAcceptable())
.andExpect(jsonPath("$.statusCode", is("ERRORCODE144")));
}
和堆栈跟踪
Java.lang.exception:意外的异常,应该是在org.junit.internal.runners.statements.expectException.evaluate(expectException.Java:28)在org.junit.internal.runners.statements.runbefores.evaluate(expectException.Java:26)在org.springframework.test.context.junit4.statements.runbefores.evaluate(expectException.Java:26)在)在org.junit.runners.parentrunner.runchildres(Parentrunner.Java:288)在org.junit.runners.parentrunner.access$000(Parentrunner.Java:58)在org.junit.runners.parentrunner.parentrunner.parentrunner.parentrunner.parentrunner.parentrunner.parentrunner.parentrunner.parentrunner.parentrunner.parentrunner.parentrunner.parentrunner在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)处运行(RemoteTestRunner.main(RemoteTestRunner.java:197),原因为:org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是com.atlassian.crowd.exception.runtime.usernotfoundexception(位于org.springframework.web.servlet.frameworkservlet.processrequest(位于org.springframework.web.servlet.frameworkservlet.processrequest:982))(位于org.springframework.web.servlet.frameworkservlet.doPost(位于org.springframework.web.servlet.framework.doPost)(位于AccessorImpl.Invoke0(本机方法)在Sun.Reflect.NativeMethodAccessorImpl.Invoke(NativeMethodAccessorImpl.java:62)在Sun.Reflect.DelegatingMethodAccessorImpl.Invoke(DelegatingMethodAccessorImpl.Invoke:43)在java.lang.Reflect.Method.Invoke:498)在org.junit.Runners.Model.FrameworkMethod$1.RunReflectiveCall(FrameworkMethod.50)在
您不能期望controller方法出现UserNotFoundException
异常,因为您只是通过日志记录并返回带有ErrorCode144
的响应来抑制它。
这里的最佳实践是配置controlleradvice
,以便可以全局处理所有异常,并且您的控制器看起来很干净,如下所示,我建议您也看看这里关于spring控制器的异常处理。
ExceptionControllerAdvice类:
@ControllerAdvice
public class ExceptionControllerAdvice {
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<String> handleUnexpectedException(UnexpectedException
unExpectedExe) {
//log and send the response back to the client here
}
}
控制器方法:
@RequestMapping(value = "${foo.controller.requestMappingUrl.login}",
method = RequestMethod.POST)
public ResponseMessage<String> loginUser(
@RequestParam("username") String username,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
return fooService.login(username);
}
JUnit设置和测试方法:
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(projectController)
.setMessageConverters(new MappingJackson2HttpMessageConverter())
.setControllerAdvice(new ExceptionControllerAdvice()).build();
}
@SuppressWarnings("unchecked")
@Test
public void testControllerUserNotFoundException() throws Exception {
Response resp = new Response();
resp.setStatusCode(StatusCode.UserNotFoundErrorCode);
when(fooService.login(any(String.class)).
thenThrow(UserNotFoundException.class);
mockMvc.perform(post("/service-user/1.0/auth/login?&username=test")
.contentType(contentType)).
andExpect(status().isNotAcceptable())
.andExpect(jsonPath("$.statusCode", is("ERRORCODE144")));
}
本文向大家介绍AngularJS 单元测试控制器,包括了AngularJS 单元测试控制器的使用技巧和注意事项,需要的朋友参考一下 示例 控制器代码: 考试: 跑!
我有两个控制器,一个用于用户,一个用于角色。我已经为用户控制器编写了测试,但是当我尝试运行测试时,它会给我以下错误: "由以下原因引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用的'uk.co.circuare.cube.service.user.repository.RoleRepository'类型的
本文向大家介绍Spring Boot Rest控制器单元测试过程解析,包括了Spring Boot Rest控制器单元测试过程解析的使用技巧和注意事项,需要的朋友参考一下 Spring Boot提供了一种为Rest Controller文件编写单元测试的简便方法。在SpringJUnit4ClassRunner和MockMvc的帮助下,可以创建一个Web应用程序上下文来为Rest Controll
在发送请求之前(当单元测试时),我是否可以得到csrf令牌?
我正在为一个应用程序工作,该应用程序使用警报告诉用户它正在使用nfc。我正在对这个应用程序进行单元测试,并在alertcontroller上设置了一个间谍。创建方法如下: 在单元测试中,我想检查是否使用正确的警报选项调用它,如下所示: 然而,问题是由于处理程序的原因,它在运行测试时给出了错误。我如何有效地测试alertcontroller.create函数是否使用正确的值调用?就像现在一样,测试给
问题内容: 我有以下情况: controller.js controllerSpec.js 错误: 我也尝试过类似的方法,但没有成功: 我该如何解决?有什么建议? 问题答案: 有两种方法(或肯定有更多方法)。 想象一下这种服务(无论它是工厂都没关系): 使用此控制器: 一种方法是使用要使用的方法创建对象并对其进行监视: 然后,将其作为dep传递给控制器。无需注入服务。那可行。 另一种方法是模拟