在Spring 3.2上为JUnits设置会话属性

我无法为测试设置会话属性。 我正在使用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;
  }

}

对于您的测试类,添加@WebAppConfiguration注释并自动@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"));

  }
}
链接地址: http://www.djcxy.com/p/11675.html

上一篇: Setting session attributes for JUnits on Spring 3.2

下一篇: Is the C# event system deterministic for single