Java 如何对SpringMVC注释控制器进行单元测试?
我正在学习Spring2.5教程,同时尝试将代码/设置更新为Spring3.0 在Spring2.5中,我有HelloController(供参考): 以及HelloController的JUnit测试(供参考): 但现在我将控制器更新为Spring3.0,它现在使用注释(我还添加了一条消息):Java 如何对SpringMVC注释控制器进行单元测试?,java,spring,junit,annotations,Java,Spring,Junit,Annotations,我正在学习Spring2.5教程,同时尝试将代码/设置更新为Spring3.0 在Spring2.5中,我有HelloController(供参考): 以及HelloController的JUnit测试(供参考): 但现在我将控制器更新为Spring3.0,它现在使用注释(我还添加了一条消息): 知道我正在使用JUnit 4.9,有人能告诉我如何对最后一个控制器进行单元测试吗?基于注释的Spring MVC的一个优点是,它们可以以简单的方式进行测试,如下所示: import org.junit.
知道我正在使用JUnit 4.9,有人能告诉我如何对最后一个控制器进行单元测试吗?基于注释的Spring MVC的一个优点是,它们可以以简单的方式进行测试,如下所示:
import org.junit.Test;
import org.junit.Assert;
import org.springframework.web.servlet.ModelAndView;
public class HelloControllerTest {
@Test
public void testHelloController() {
HelloController c= new HelloController();
ModelAndView mav= c.handleRequest();
Assert.assertEquals("hello", mav.getViewName());
...
}
}
这种方法有什么问题吗
对于更高级的集成测试,有一个解决方案。您还可以研究其他独立于Spring类或的web测试框架。除了Sasha所描述的以外,您不会发现任何单独使用JUnit的更健壮的策略,除非您应该明确地断言模型。使用mvc:annotation-driven,您必须有两个步骤:首先使用HandlerMapping解析对处理程序的请求,然后通过HandlerAdapter使用该处理程序执行方法。比如:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("yourContext.xml")
public class ControllerTest {
@Autowired
private RequestMappingHandlerAdapter handlerAdapter;
@Autowired
private RequestMappingHandlerMapping handlerMapping;
@Test
public void testController() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
// request init here
MockHttpServletResponse response = new MockHttpServletResponse();
Object handler = handlerMapping.getHandler(request).getHandler();
ModelAndView modelAndView = handlerAdapter.handle(request, response, handler);
// modelAndView and/or response asserts here
}
}
这适用于Spring3.1,但我想每一个版本都必须有它的一些变体。看看Spring 3.0代码,我想说DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter应该可以做到这一点。+1非常感谢Sasha。它工作得很好。我无法想象它会如此简单。如果在中有@Autowired组件,这将不起作用HelloController@AramKocharyan:在单元测试中,我建议不要通过构造函数或setter显式地使用自动连线和供应依赖项。如果你真的想要所有春天的美好,你可能想看看@SashaO yeah这周了解到:P我只是用一个setter设置自动连线实例,正如你所说的,效果很好。我觉得这种方法太白箱了。视图被称为“hello”并不意味着正在做需要做的事情。我们正在使用HttpClient对控制器进行单元测试。就像测试是浏览器一样。@我在
Object handler=handlerMapping.getHandler(request.getHandler())中得到了空指针异常代码>我该怎么做solve@jackyesind,如回答中所述,必须初始化请求。类似于newmockhttpservletresponse(“GET”,“your/uri”)代码>可能重复的
@Controller
public class HelloController {
protected final Log logger = LogFactory.getLog(getClass());
@RequestMapping("/hello")
public ModelAndView handleRequest() {
logger.info("Returning hello view");
return new ModelAndView("hello", "message", "THIS IS A MESSAGE");
}
}
import org.junit.Test;
import org.junit.Assert;
import org.springframework.web.servlet.ModelAndView;
public class HelloControllerTest {
@Test
public void testHelloController() {
HelloController c= new HelloController();
ModelAndView mav= c.handleRequest();
Assert.assertEquals("hello", mav.getViewName());
...
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("yourContext.xml")
public class ControllerTest {
@Autowired
private RequestMappingHandlerAdapter handlerAdapter;
@Autowired
private RequestMappingHandlerMapping handlerMapping;
@Test
public void testController() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
// request init here
MockHttpServletResponse response = new MockHttpServletResponse();
Object handler = handlerMapping.getHandler(request).getHandler();
ModelAndView modelAndView = handlerAdapter.handle(request, response, handler);
// modelAndView and/or response asserts here
}
}