2013-01-09 36 views
7

我在設置測試的會話屬性時遇到了問題。我正在使用MockMvc來測試對控制器的調用。會話模型上有一個成員屬性(表示已登錄的人)。 SessionModel對象被添加爲會話屬性。我期待它被填充到ModelMap參數中以形成下面的formBacking方法,但ModelMap總是空的。在Spring 3.2上爲JUnits設置會話屬性

控制器代碼在通過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; 
    } 

} 

回答

3

控制器爲您的測試類中添加@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")); 

    } 
} 
+0

謝謝曼努埃爾。對不起,我應該說,我有這些註釋/自動佈線變量,但不幸的是它仍然不適合我。我也嘗試像上面那樣明確地設置會話(而不是sessionAttr) –