Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何对SpringMVC注释控制器进行单元测试?_Java_Spring_Junit_Annotations - Fatal编程技术网

Java 如何对SpringMVC注释控制器进行单元测试?

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.

我正在学习Spring2.5教程,同时尝试将代码/设置更新为Spring3.0

在Spring2.5中,我有HelloController(供参考):

以及HelloController的JUnit测试(供参考):

但现在我将控制器更新为Spring3.0,它现在使用注释(我还添加了一条消息):


知道我正在使用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
    }
}