@ModelAttribute controller spring-mvc-Spott
Ich möchte zum testen eine Steuerung, die mit @ModelAttribute
für eines seiner Methode Argumente.
public String processSaveAction(@ModelAttribute("exampleEntity") ExampleEntity exampleEntity)
@ModelAttribute
Methode getExampleEntity
ist mit @RequestParam
:
@ModelAttribute("exampleEntity")
public ExampleEntity getExampleEntity(@RequestParam(value = "id", required = true) ExampleEntity exampleEntity) {
Mein controller ist mit WebDataBinder
zu nennen, eine Fabrik, in der ein Objekt zurückgibt, basierend auf der Parameter "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;
}
}
Und mein 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());
}
}
Ich will irgendwie mock getExampleEntity()
so, dass jedes mal, wenn ich eine POST mit dem parameter "id", erhalte ich eine ironisierte Objekt ("exampleEntity") für den test.
Ich vorstellen könnte @Binding
auf die Probe, aber dann hätte ich zu verspotten viele Ebenen der Methoden (wie initBinder -> idEditoryFactory-> editor -> hibernateTemplate und so weiter) nur um eine Einheit, aus einer Quelle (beispielsweise einer Datenbank).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Sie übergeben können, die erforderlich
@ModelAttribute
Objekt mit der.flashAttr()
Methode etwa so:Ersten, test-code sollte sich nicht ändern unseren code entwickeln. @ModeleAttribute mounten von Ihrem param-Attribut,so .param() ist genug. Unten ist mein demo:
Dann ist mein Controller.
Diese Einreichen können Recht user-Objekt das public String register(@ModelAttribute("user")User, ModelMap model).