2016-05-11 8 views
0

ich einen Komponententest basiert auf den folgenden Teil des Codes auszuführen haben:Spring MVC: Wie verschachtelte Objekteigenschaften in der @ModelAttribute binden

@RequestMapping(value = "/changePass", method = RequestMethod.POST) 
    public ModelAndView changePass(@ModelAttribute(TAPPLICATION) AppBean applicationBean, BindingResult result, ModelMap model, Principal principal, HttpServletRequest request) throws NSException, SQLException { 
     // ... 

     if (applicationBean != null 
        && applicationBean.getChangePassDto() != null 
        && StringUtils.isNotEmpty(applicationBean.getChangePassDto().getNewPassword())) { 

       String newPassword = applicationBean.getChangePassDto().getNewPassword(); 
       // ...     
      } 
      // ... 

Die AppBean enthält folgende Getter und Setter:

private ChangePassDto changePassDto; 

    public ChangePassDto getChangePassDto() { 
     return changePassDto; 
    } 

    public void setChangePassDto(ChangePasswordDto changePassDto) { 
     this.changePassDto = changePassDto; 
    } 

Grundsätzlich, wenn ich die Testeinheit auszuführen ist die Methode applicationBean.getChangePassDto()nullapplicationBean aber nicht null ist. Wie kann ich die applicationBean.getChangePassDto() initialisieren, so dass sie null nicht zurückgibt? Ich habe die anderen Nicht-Objekt-Parameter mit der .param-Methode initialisiert, wie es in meinem Komponententest zu sehen ist.

Ich verwende auch Powermock als Unit-Test-Framework.

Hier finden Sie einen Teil meines Unit-Tests:

@Before 
    public void setup() { 

     request = new MockHttpServletRequest(); 
     request.setAttribute(DispatcherServlet.OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap()); 
     response = new MockHttpServletResponse(); 
     session = new MockHttpSession(); 
     request.setSession(session); 
     RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); 

     //Added viewResolver to prevent circular view path error 
     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setPrefix("/WEB-INF/jsp/"); 
     viewResolver.setSuffix(".jsp"); 

     this.mockMvc = MockMvcBuilders.standaloneSetup(appController).setViewResolvers(viewResolver).build();  
    } 

    @Test 
    public void changePass_ExpectC() throws Exception { 

     PowerMockito.doNothing().when(passwordVal).validate(any(User.class), anyListOf(Params.class), any(Object.class),any(Errors.class)); 


     mockMvc.perform(post("/changePass").param("userLogName", "JOHN").param("userLogged", "userLogged").param("password", "password123").param("newPassword", "newPassword123").param("confirmNewPassword", "newPassword123")) 
       .andExpect(view().name(Constants.DENIED)) 
       .andExpect(status().isOk() 
       ); 
    } 

Jede Idee, wie ich applicationBean.getchangePassDto() intitialise kann, so dass es nicht null ist?

Vielen Dank im Voraus für Hilfe.

Antwort

0

einfach eine neue Instanz von ChangePassDto in Ihrem AppBean erstellen:

public class AppBean { 

    private ChangePassDto changePassDto = new ChangePassDto(); 

    public ChangePassDto getChangePassDto() { 
    return changePassDto; 
    } 

    public void setChangePassDto(ChangePasswordDto changePassDto) { 
    this.changePassDto = changePassDto; 
    } 

    // ... 
} 

Sie dann den vollständigen Pfad zu den Eigenschaften in der verschachtelten DTO wie diese verwenden müssen:

mockMvc.perform(post("/changePass") 
    .param("changePassDto.userLogName", "JOHN") 
    .param("changePassDto.userLogged", "userLogged") 
    .param("changePassDto.password", "password123") 
    .param("changePassDto.newPassword", "newPassword123") 
    .param("changePassDto.confirmNewPassword", "newPassword123")) 
.andExpect(view().name(Constants.DENIED)) 
.andExpect(status().isOk()); 
+0

Hallo, ich habe eine Frage bitte, wenn ich den neuen ChangePassDto() Teil in meiner AppBean, Feder nicht die ChangePassDto Instanz verwalten, da es nicht von Frühling geladen wird? – user1999453

+0

In diesem Szenario muss Spring Ihr DTO nicht verwalten. Es muss lediglich die Anforderungsparameter an die Eigenschaften Ihres DTO binden. Ich werde meine Antwort entsprechend aktualisieren. –

Verwandte Themen