当前位置: 首页 > 知识库问答 >
问题:

spring控制器catch块中的单元测试代码

伯英锐
2023-03-14

我有以下结构的控制器:

@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)在

共有1个答案

轩辕乐邦
2023-03-14

您不能期望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传递给控制器​​。无需注入服务。那可行。 另一种方法是模拟