在Mock Spring Junit测试期间注入/设置对象

时间:2016-07-06 17:30:56

标签: java spring unit-testing spring-mvc junit

我想在我的项目中测试控制器。我有以下课程(不重要的代码被跳过):

家庭控制器:

@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应用程序的正常执行期间,控制器运行良好。我使用User Interceptor将用户设置在Session Preferences类中,该类具有范围会话并且对所有视图都可见。 当我编写单元测试时,它会在尝试访问用户ID时给我空指针,因为用户显然没有在sessionPreferences中设置。

问题是,如何在Junit中设置autowired类中的对象?我看到我的用户拦截器在Junit测试期间无法正常工作。 我希望能够在测试类中做到这样的事情:

this.sessionPreferences.setUser(user);

为了在没有空指针的情况下调用此方法:

eventSuggestedService.getSuggestedPopularEventsV2(sessionPreferences.getUser().getUserId(), 10, new Date(), 1, 5)

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

sessoinPreferences是一个模拟,因此您可以将以下内容添加到setup或测试方法中:

User user=new User();
user.setUserId(...);    
when(sessionPreferences.getUser()).thenReturn(user);