【发布时间】:2013-01-14 08:16:12
【问题描述】:
我正在使用 Spring MVC 编写一个 Rest 服务。以下是课程大纲:
@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。
【问题讨论】:
-
一般来说,我会说测试你自己的代码,而不是框架。
-
我建议测试
@ExceptionHandler的存在并且我已经通过自动化测试正确配置了框架是有价值的。 -
当然可以,但这可能超出了单元测试的范围。回想一下,除了您的 jUnit 测试之外,您还需要一个正确设置的 spring 配置文件。另外,升级 Spring 后,您的测试可能必须更改。一般来说,我发现如果我正确配置了一次框架,我倾向于在任何地方都正确配置它,否则当我尝试部署我的应用程序时会立即发生一些快速失败。
-
您可能还认为框架本身具有详尽的单元测试套件,可供您随时查看。
-
我建议我要测试的不是框架,而是我正确设置了注释。这就是使用
AnnotationMethodHandlerAdapter在@RequestMapping的情况下的锥体。我正在寻找对我的@ExceptionHandler注释进行相同类型的测试,这是一种自动测试,相应的响应代码与相应的消息一起返回。这不是测试框架,而是测试我的代码。我可以进行反思以查找类中的注释并检查它们是否正确,但似乎应该有更好的方法。
标签: java spring rest spring-mvc junit