Установка атрибутов сеанса для JUnits в Spring 3.2

У меня возникли проблемы с настройкой атрибутов сеанса для теста. Я использую MockMvc для проверки вызовов контроллера. В модели сеанса есть атрибут участника (представляющий человека, вошедшего в систему). Объект SessionModel добавляется как атрибут сеанса. Я ожидал, что он будет заполнен в параметре ModelMap для метода formBacking ниже, но ModelMap всегда пуст.

Код контроллера отлично работает при работе через веб-приложение, но не в 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;
  }

}

person Ash McConnell    schedule 09.01.2013    source источник


Ответы (1)


Для вашего тестового класса добавьте аннотацию @WebAppConfiguration и также автоматически подключите следующее. (WebApplicationContext и MockHttpSession )

@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"));

  }
}
person Manuel Quinones    schedule 09.01.2013
comment
Спасибо, Мануэль. Извините, я должен был сказать, что у меня есть эти аннотации / автосвязанные переменные, но, к сожалению, они все еще не работают для меня. Я также попытался установить сеанс явно, как указано выше (вместо sessionAttr) - person Ash McConnell; 10.01.2013