@ModelAttribute contrôleur spring-mvc moqueur
Je veux tester un contrôleur qui est à l'aide de @ModelAttribute
pour l'un de ses arguments de méthode.
public String processSaveAction(@ModelAttribute("exampleEntity") ExampleEntity exampleEntity)
@ModelAttribute
méthode getExampleEntity
est à l'aide de @RequestParam
:
@ModelAttribute("exampleEntity")
public ExampleEntity getExampleEntity(@RequestParam(value = "id", required = true) ExampleEntity exampleEntity) {
Mon contrôleur est à l'aide de WebDataBinder
appeler une usine, qui renvoie un objet en fonction du param "id".
@Controller
public class ExampleController(){
@Autowired private IdEditorFactory idEditorFactory;
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(ExampleEntity.class, idEditorFactory.createEditor(ExampleEntity.class));
}
@ModelAttribute("exampleEntity")
public ExampleEntity getExampleEntity(@RequestParam(value = "id", required = true) ExampleEntity exampleEntity) {
//Irrelevant operations
return exampleEntity;
}
@RequestMapping(method = RequestMethod.POST, params = "action=save")
public String processSaveAction(
@RequestParam(value = "confirmed") String exampleString,
@ModelAttribute("exampleEntity") ExampleEntity exampleEntity,
BindingResult result, HttpServletRequest request)
throws IOException {
boolean success = editorProcessor.processSaveAction(exampleString,
exampleEntity, result, request);
return success ? getSuccessView(exampleEntity) : VIEW_NAME;
}
}
Et mon test:
@WebAppConfiguration
public class ExampleControllerTest{
@Mock private EditorProcessor editorProcessor;
@Mock private IdEditorFactory idEditorFactory;
@InjectMocks private ExampleController exampleController;
private MockMvc mockMvc;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(exampleController).build();
WebDataBinder webDataBinder = new WebDataBinder(ExampleEntity.class);
webDataBinder.registerCustomEditor(ExampleEntity.class, idEditorFactory.createEditor(ExampleEntity.class));
}
@Test
public void shouldProcessSaveAction() throws Exception {
//given
BindingResult result = mock(BindingResult.class);
ExampleEntity exampleEntity = mock(ExampleEntity.class);
HttpServletRequest httpServletRequest = mock(HttpServletRequest.class);
given(editorProcessor.processSaveAction("confirmed", exampleEntity, result, httpServletRequest)).willReturn(true);
//when
ResultActions perform = mockMvc.perform(post("/").sessionAttr("exampleEntity", exampleEntity)
.param("id", "123456"
.param("action","save"));
//then
perform.andDo(print())
.andExpect(status().isOk());
}
}
Je veux en quelque sorte de simulacre de getExampleEntity()
de sorte que chaque fois que je fais un POST avec le paramètre "id", je reçois un moqué de l'objet ("exampleEntity") pour le test.
Je pourrais introduire @Binding
à l'épreuve, mais alors que j'aurais à se moquer de nombreux niveaux de méthodes (comme initBinder -> idEditoryFactory-> editor -> hibernateTemplate et ainsi de suite) seulement pour obtenir une entité à partir d'une source (par exemple, une base de données).
Vous devez vous connecter pour publier un commentaire.
Vous pouvez passer dans le
@ModelAttribute
objet avec le.flashAttr()
méthode comme suit:D'abord, le code de test ne devrait pas changer nos développer du code. @ModeleAttribute sera la monture de votre param attribut,donc .param() est suffisant. Ci-dessous est mon démo:
Est mon Contrôleur.
Cela peut soumettre le droit de l'utilisateur de l'objet à la Chaîne publique de registre(@ModelAttribute("utilisateur")de l'Utilisateur l'utilisateur, ModelMap modèle).