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

为@ExceptionHandler编写JUnit测试

卫骏
2023-03-14
 @Controller
 public class MyController{

     @RequestMapping(..)
     public void myMethod(...) throws NotAuthorizedException{...}

     @ExceptionHandler(NotAuthorizedException.class)
     @ResponseStatus(value=HttpStatus.UNAUTHORIZED, reason="blah")
     public void handler(...){...}
 }
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(....)
public class mytest{

    MockHttpServletRequest requestMock;
    MockHttpServletResponse responseMock;
    AnnotationMethodHandlerAdapter handlerAdapter;

@Before
public void setUp() {
    requestMock = new MockHttpServletRequest();
    requestMock.setContentType(MediaType.APPLICATION_JSON_VALUE);
    requestMock.addHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);

    responseMock = new MockHttpServletResponse();

    handlerAdapter = new AnnotationMethodHandlerAdapter();
}

@Test
public void testExceptionHandler(){
    // setup ....
    handlerAdapter.handle(...);

    // verify
    // I would like to do the following
    assertThat(responseMock.getStatus(), is(HttpStatus.UNAUTHORIZED.value()));
}

}

请注意,我没有访问实际的代码在一个地方,我可以张贴它。

此外,我也限于(由于不幸的原因)使用Spring 3.0.5或3.1.2。

共有1个答案

李昊苍
2023-03-14

考虑使用Spring3.2及其mvc-test-framework

import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml")
public class WebMvcTest {

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

    @Test
    public void getFoo() throws Exception {
        this.mockMvc.perform(
            get("/testx")
            .contentType(MediaType.APPLICATION_JSON)
            .accept(MediaType.APPLICATION_JSON)
            )
            .andExpect(status().isUnauthorized());
    }
}

控制器代码

@Controller
public class MyController {

    public class MyException extends RuntimeException {
    };

    @RequestMapping("/testx")
    public void myMethod() {
        throw new MyException();

    }

    @ExceptionHandler(MyException.class)
    @ResponseStatus(value = HttpStatus.UNAUTHORIZED, reason = "blah")
    public void handler() {
        System.out.println("handler processed");
    }
}

这个“考验”通过得很好。

 类似资料:
  • customer-Mapper.xml daoimpl.java

  • 我有一个程序,显示与名称和用户需要输入他们的字段。我怎么测试这个? AssertionError:JSON路径“$.FirstName”处没有值,异常:JSON不能为null或空 我的测试: storetest.java

  • 我是故意在谈论系统测试。我们确实有一套相当详尽的单元测试,其中一些使用了模拟,而这些测试不会去任何地方。系统测试应该是对单元测试的补充,因此,模拟不是一种选择。 如果我将替换为一个test-method(让我们称之为),并引入一个顺序依赖项(使用JUnit 5非常容易),它强制在运行任何其他测试之前运行,那么这些问题就会消失。 到目前为止还好!这看起来和工作很好。当测试不是由CI服务器执行,而是由

  • 我正在尝试为这样的情况编写测试用例,在这个情况下,我期待的是datatruncation异常,我试图使用assert equals和比较消息来断言相同的情况,但是看起来像是比较两个字符串,有没有更好的方法来为这样的异常编写测试用例。 我正在使用JUnit5

  • 你好,我是java的新手,我对如何编写JUnit测试感到困惑,有人能帮忙吗? 任务说明: 当您将自动取款机(ATM)与银行卡一起使用时,您需要使用个人识别码(PIN)来访问您的帐户。如果用户在输入PIN码时失败三次以上,机器将阻止该卡。 假设用户的PIN是“1234”,编写一个程序,向用户索要PIN不超过三次,并执行以下操作: 如果用户输入了正确的号码,请打印一条消息,说明“您的PIN是正确的”,

  • 问题内容: 我可以为以下代码编写的最 详尽的 测试是什么? 此方法在类内。该方法调用JpaRepository,然后在实体上调用其方法。 如果无法测试是否要删除实体,是否可以在该方法上运行 其他 任何功能? 问题答案: 有两种测试策略。一种是单元测试,即确保您的服务正常运行。另一个是集成/端到端测试,即确保所有功能都能很好地协同工作。 您对自己拥有的东西进行单元测试,对所有内容进行集成测试。这是一