gpt4 book ai didi

java - 为 @ExceptionHandler 编写 JUnit 测试

转载 作者:IT老高 更新时间:2023-10-28 13:47:14 24 4
gpt4 key购买 nike

我正在使用 Spring MVC 编写一个 Rest 服务。以下是类(class)大纲:

 @Controller
public class MyController{

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

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

我已经使用 here 发布的设计编写了单元测试。 .测试基本如下:

@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()));
}

}

但是,对 handle 的调用抛出 NotAuthorizedException。我已经读到,这是设计使然能够对方法抛出适当的异常进行单元测试,但是我想编写一个自动化测试,证明框架正在适本地处理这个异常,并且被测试的类已经适本地实现了处理程序.有没有办法做到这一点?

请注意,我无法在可以发布的地方访问实际代码。

另外,我仅限于(由于不幸的原因)Spring 3.0.5 或 3.1.2。

最佳答案

考虑使用 Spring 3.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 代码

@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");
}
}

这个“测试”顺利通过。

免责声明:目前我是 Spring MVC 测试的菜鸟,实际上这是我的第一次测试。
更新:感谢德雷克 the correction .

关于java - 为 @ExceptionHandler 编写 JUnit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14605287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com