Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
Spring mvc MockMVC将测试控制器与会话范围bean集成_Spring Mvc_Junit_Integration Testing_Stateful Session Bean_Mockmvc - Fatal编程技术网

Spring mvc MockMVC将测试控制器与会话范围bean集成

Spring mvc MockMVC将测试控制器与会话范围bean集成,spring-mvc,junit,integration-testing,stateful-session-bean,mockmvc,Spring Mvc,Junit,Integration Testing,Stateful Session Bean,Mockmvc,我试图集成测试一个Spring控制器方法,该方法使用注入控制器的Spring会话范围bean。为了让测试通过,我必须能够访问会话bean,在对该控制器方法进行模拟调用之前在其上设置一些值。问题是,在我调用时创建了一个新的会话bean,而不是使用我从模拟应用程序上下文中提取的会话bean。如何使我的控制器使用相同的UserSessionbean 这是我的测试用例 @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration("sr

我试图集成测试一个Spring控制器方法,该方法使用注入控制器的Spring会话范围bean。为了让测试通过,我必须能够访问会话bean,在对该控制器方法进行模拟调用之前在其上设置一些值。问题是,在我调用时创建了一个新的会话bean,而不是使用我从模拟应用程序上下文中提取的会话bean。如何使我的控制器使用相同的UserSessionbean

这是我的测试用例

    @RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration("src/main/webapp")
@ContextConfiguration({"file:src/main/webapp/WEB-INF/applicationContext.xml",
        "file:src/main/webapp/WEB-INF/rest-servlet.xml",
        "file:src/main/webapp/WEB-INF/servlet-context.xml"})
public class RoleControllerIntegrationTest {

    @Autowired
    private WebApplicationContext wac;

    protected MockMvc mockMvc;
    protected MockHttpSession mockSession;

    @BeforeClass
    public static void setupClass(){
        System.setProperty("runtime.environment","TEST");
        System.setProperty("com.example.UseSharedLocal","true");
        System.setProperty("com.example.OverridePath","src\\test\\resources\\properties");
        System.setProperty("JBHSECUREDIR","C:\\ProgramData\\JBHSecure");
    }

    @Before
    public void setup(){
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
        mockSession = new MockHttpSession(wac.getServletContext(), UUID.randomUUID().toString());
        mockSession.setAttribute("jbhSecurityUserId", "TESTUSER");
    }

    @Test
    public void testSaveUserRole() throws Exception {

        UserSession userSession = wac.getBean(UserSession.class);
        userSession.setUserType(UserType.EMPLOYEE);
        userSession.setAuthorizationLevel(3);

        Role saveRole = RoleBuilder.buildDefaultRole();
        Gson gson = new Gson();
        String json = gson.toJson(saveRole);

        MvcResult result = this.mockMvc.perform(
                post("/role/save")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(json)
                        .session(mockSession))
                .andExpect(status().isOk())
                .andReturn();

        MockHttpServletResponse response = result.getResponse();

    }
这是我需要测试的控制器方法

    @Resource(name="userSession")
    private UserSession userSession;

    @RequestMapping(method = RequestMethod.POST, value = "/save")
    public @ResponseBody ServiceResponse<Role> saveRole(@RequestBody Role role,HttpSession session){

        if(userSession.isEmployee() && userSession.getAuthorizationLevel() >= 3){
            try {
                RoleDTO savedRole = roleService.saveRole(role,ComFunc.getUserId(session));
                CompanyDTO company = userSession.getCurrentCompany();
controlle和bean都是使用my applicationContext.xml中的组件扫描创建的

<context:annotation-config />
    <!-- Activates various annotations to be detected in bean classes -->
    <context:component-scan
        base-package="
            com.example.app.externalusersecurity.bean,
            com.example.app.externalusersecurity.service,
            com.example.app.externalusersecurity.wsc"/>
    <mvc:annotation-driven />

添加以下bean配置,为每个线程添加会话上下文

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
        <map>
            <entry key="session">
                <bean class="org.springframework.context.support.SimpleThreadScope"/>
            </entry>
        </map>
    </property>
</bean>

Java的配置类中的一个等价项是下面的bean声明

@Bean
  public CustomScopeConfigurer scopeConfigurer() {
    CustomScopeConfigurer configurer = new CustomScopeConfigurer();
    Map<String, Object> workflowScope = new HashMap<String, Object>();
    workflowScope.put("session", new SimpleThreadScope());
    configurer.setScopes(workflowScope);

    return configurer;
  }
@Bean
公共CustomScopeConfigurer scopeConfigurer(){
CustomScopeConfigurer configurer=新的CustomScopeConfigurer();
Map workflowScope=新HashMap();
put(“会话”,新的SimpleThreadScope());
配置器设置范围(工作流范围);
返回配置器;
}
有关详细信息,请参阅

在测试和生产中使用不同的方法对我很有效-下面是基于XML的设置的外观:

<beans profile="production">
    <bean id="userSession" class="UserSessionImpl" scope="session" >
        <aop:scoped-proxy/>
    </bean>
</beans>

<beans profile="test">
    <bean id="userSession" class="UserSessionImpl" >
    </bean>
</beans>
<beans profile="production">
    <bean id="userSession" class="UserSessionImpl" scope="session" >
        <aop:scoped-proxy/>
    </bean>
</beans>

<beans profile="test">
    <bean id="userSession" class="UserSessionImpl" >
    </bean>
</beans>
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration("src/main/webapp")
@ContextConfiguration({"file:src/main/webapp/WEB-INF/applicationContext.xml",
    "file:src/main/webapp/WEB-INF/rest-servlet.xml",
    "file:src/main/webapp/WEB-INF/servlet-context.xml"})
@ActiveProfiles(profiles = {"test"})
public class RoleControllerIntegrationTest {
[...]