【发布时间】:2016-07-06 17:30:56
【问题描述】:
我想在我的项目中测试控制器。我有以下课程(不重要的代码被跳过):
家庭控制器:
@Autowired
private SessionPreferences sessionPreferences;
//controller methods
private Pager<EventSuggestedAndPopular> discoverSuggested() {
return SecurityUtils.isUserLogged()
? eventSuggestedService.getSuggestedPopularEventsV2(sessionPreferences.getUser().getUserId(), 10, new Date(), 1, 5)
: eventSuggestedService.getSuggestedPopularEventsV2(321, 10, new Date(), 1, 5);
}
和测试类:
@Autowired
WebApplicationContext wac;
@Autowired
MockHttpSession session;
@Autowired
MockHttpServletRequest request;
@InjectMocks
private HomeController controller;
@Mock
private SessionPreferences sessionPreferences;
@Autowired
private UserService userService;
private MockMvc mockMvc;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}
@Test
public void testIndexWithLoggedUser() throws Exception {
this.mockMvc.perform(get("/login").header("Referer", ""));
this.mockMvc.perform(post("/login").param("email", "123@test.pl").param("password", "Test1!").param("rememberMe", "true"))
.andExpect(status().isFound()).andExpect(redirectedUrl("/home"));
UserSummary user = userService.findByEmail("info@test.com");
this.sessionPreferences.setUser(user);
// when(sessionPreferences.getUser()).thenReturn(user); //I also used this, but it didn't work.
this.mockMvc.perform(get("/").param("lat", "0.0").param("lon", "0.0").accept(MediaType.TEXT_HTML)).andExpect(status().isOk())
.andExpect(view().name("home"));
this.mockMvc.perform(get("/").accept(MediaType.TEXT_HTML)).andExpect(status().isOk()).andExpect(view().name("home"));
this.mockMvc.perform(get("/home/").accept(MediaType.TEXT_HTML)).andExpect(status().isOk()).andExpect(view().name("home"));
}
控制器在 Web 应用程序的正常执行过程中运行良好。我使用用户拦截器在 Session Preferences 类中设置用户,该类具有范围会话并且对所有视图可见。 当我编写单元测试时,它给了我一个空指针,当它尝试访问用户 ID 时,因为用户显然没有在 sessionPreferences 中设置。
问题是,如何在 Junit 的自动装配类中设置对象?我看到我的用户拦截器在 Junit 测试期间不起作用。 我希望能够在测试类中做这样的事情:
this.sessionPreferences.setUser(user);
为了在没有空指针的情况下调用这个方法:
eventSuggestedService.getSuggestedPopularEventsV2(sessionPreferences.getUser().getUserId(), 10, new Date(), 1, 5)
感谢您的帮助。
【问题讨论】:
标签: java spring unit-testing spring-mvc junit