【问题标题】:Setting session attributes for JUnits on Spring 3.2在 Spring 3.2 上为 JUnit 设置会话属性
【发布时间】:2012-12-23 08:37:36
【问题描述】:

我在为测试设置会话属性时遇到问题。我正在使用 MockMvc 来测试对控制器的调用。会话模型上有一个成员属性(代表已登录的人)。 SessionModel 对象作为会话属性添加。我期待它在 ModelMap 参数中填充到下面的 formBacking 方法,但 ModelMap 始终为空。

控制器代码在通过 webapp 运行时可以正常工作,但在 JUnit 中则不行。知道我做错了什么吗?

这是我的 JUnit 测试

@Test
  public void testUnitCreatePostSuccess() throws Exception {

    UnitCreateModel expected = new UnitCreateModel();
    expected.reset();
    expected.getUnit().setName("Bob");

    SessionModel sm = new SessionModel();
    sm.setMember(getDefaultMember());

    this.mockMvc.perform(
        post("/units/create")
        .param("unit.name", "Bob")
        .sessionAttr(SessionModel.KEY, sm))
        .andExpect(status().isOk())
        .andExpect(model().attribute("unitCreateModel", expected))
        .andExpect(view().name("tiles.content.unit.create"));

  }

这里是有问题的控制器

@Controller
@SessionAttributes({ SessionModel.KEY, UnitCreateModel.KEY })
@RequestMapping("/units")
public class UnitCreateController extends ABaseController {

  private static final String CREATE = "tiles.content.unit.create";

  @Autowired
  private IUnitMemberService unitMemberService;

  @Autowired
  private IUnitService unitService;

  @ModelAttribute
  public void formBacking(ModelMap model) {

    SessionModel instanceSessionModel = new SessionModel();
    instanceSessionModel.retrieveOrCreate(model);

    UnitCreateModel instanceModel = new UnitCreateModel();
    instanceModel.retrieveOrCreate(model);
  }

  @RequestMapping(value = "/create", method = RequestMethod.GET)
  public String onCreate(
      @ModelAttribute(UnitCreateModel.KEY) UnitCreateModel model, 
      @ModelAttribute(SessionModel.KEY) SessionModel sessionModel) {

    model.reset();

    return CREATE;
  }

  @RequestMapping(value = "/create", method = RequestMethod.POST)
  public String onCreatePost(
      @ModelAttribute(SessionModel.KEY) SessionModel sessionModel,
      @Valid @ModelAttribute(UnitCreateModel.KEY) UnitCreateModel model, 
      BindingResult result) throws ServiceRecoverableException {

    if (result.hasErrors()){
      return CREATE;
    }

    long memberId = sessionModel.getMember().getId();

    long unitId = unitService.create(model.getUnit());
    unitMemberService.addMemberToUnit(memberId, unitId, true);

    return CREATE;
  }

}

【问题讨论】:

    标签: spring junit spring-test-mvc


    【解决方案1】:

    为您的测试类添加 @WebAppConfiguration 注释并自动装配以下内容。(WebApplicationContextMockHttpSession

    @RunWith(SpringJUnit4ClassRunner.class)
    @WebAppConfiguration
    @ContextConfiguration({ "classpath:springDispatcher-servlet.xml" })
    public class MySessionControllerTest {
        @Autowired WebApplicationContext wac; 
        @Autowired MockHttpSession session;
    
        private MockMvc mockMvc;
    
        @Before
        public void setup() {
            this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
        }
    
        @Test
        public void testUnitCreatePostSuccess() throws Exception {
            UnitCreateModel expected = new UnitCreateModel();
            expected.reset();
            expected.getUnit().setName("Bob");
    
            SessionModel sm = new SessionModel();
            sm.setMember(getDefaultMember());
            session.setAttribute(SessionModel.KEY, sm);
            this.mockMvc.perform(
                post("/units/create")
                .session(session)
                .param("unit.name", "Bob")
                .andExpect(status().isOk())
                .andExpect(model().attribute("unitCreateModel", expected))
                .andExpect(view().name("tiles.content.unit.create"));
    
      }
    }
    

    【讨论】:

    • 谢谢曼努埃尔。抱歉,我应该说,我确实有那些注释/自动装配变量,但不幸的是它仍然对我不起作用。我也尝试过像上面那样明确设置会话(而不是 sessionAttr)
    猜你喜欢
    • 2016-04-20
    • 2018-08-26
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    相关资源
    最近更新 更多