我正在尝试为我的控制器创建一个测试。这是我有类似的东西。只需更改名称。我正在使用Mockito和Spring MVC。测试配置文件中的自动装配bean通过模拟工厂进行模拟。我得到一个空指针......
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
...
})
public class MyReportControllerTest {
private MockHttpServletRequest request;
private MockHttpServletResponse response;
private MockHttpSession session;
private HandlerAdapter handlerAdapter;
@Autowired
private ApplicationContext applicationContext;
@Autowired
private MyService myService;
@Autowired
private RequestMappingHandlerMapping rmhm;
@Before
public void setUp() throws Exception {
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
session = new MockHttpSession();
handlerAdapter = applicationContext
.getBean(RequestMappingHandlerAdapter.class);
request.setSession(session);
request.addHeader("authToken", "aa");
Mockito.when(
myService.getMyInfo(YEAR))
.thenReturn(getMyInfoList());
}
@Test
public void testGetMyInfo(){
request.setRequestURI("/getMyInfo/" + 2011);
request.setMethod("GET");
try {
if( handlerAdapter == null){
System.out.println("Handler Adapter is null!");
}
if( request == null){
System.out.println("Request is null!");
}
if( response == null){
System.out.println("Response is null!");
}
if( rmhm.getHandler(request) == null){
System.out.println("rmhm.getHandler(request) is null!");
}
//the above returns null
System.out.println("RMHM: " + rmhm.toString());
System.out.println("RMHM Default Handler: " + rmhm.getDefaultHandler());
handlerAdapter.handle(request, response,
rmhm.getHandler(request)
.getHandler());//null pointer exception here <---
...
} catch (Exception e) {
e.printStackTrace();
fail("getMyReport failed. Exception");
}
}
public List<MyInfo> getMyInfoList(){...}
我做了彻底的调试,发现Handler对我的模拟请求保持为null。我错过了什么,它没有变成处理程序,甚至转到默认处理程序?
答案 0 :(得分:0)
你在这里遇到了很多问题。
首先,您是否尝试单元测试您的Controller,或集成测试它?
它看起来更像是集成测试;你有Spring @Autowired
注释和@ContextConfiguration
。
但如果是这种情况,为什么要尝试在myService
上定义模拟行为?这永远不会起作用 - 春天将注入一个“真实”的实例,Mockito没有希望在其上发挥其魔力。
相关;你错过了任何一种模拟初始化调用,如果你想让它工作就需要它。
最后,为什么在根据测试名称判断所有这些连接(HandlerMappings,HandlerAdapters等)时,你真正想做的就是测试你的MyReportController
?您是否可以根据需要简单地使用模拟请求,响应等调用必要的“端点”方法?