Ich versuche, einen Komponententest für einen Controller zu schreiben, der je nach Gerätetyp unterschiedliche Dinge tut.Mock-Gerät für Controller-Test
Die erste Controller-Methode und ihr Test funktioniert gut, die Methode Parameter Modell hat einen Wert und ich kann den Wert im Test validieren.
Die zweite Controller-Methode, die erwartet, dass ein Gerät funktioniert, wenn von einem Browser, aber nicht in einem Komponententest aufgerufen wird. Wenn die Testmethode doSomething2Test()
genannt wird erhalte ich eine
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.mobile.device.Device]: Specified class is an interface
Meine Frage: Warum die korrekt instanziiert Parameter Modell ist aber Gerät nicht? Gibt es eine Möglichkeit, das Gerät in der MockMvc-Anfrage einzustellen oder kann ich das Gerät irgendwie verspotten?
Controller:
@Controller
@RequestMapping("home")
public class MyController {
@RequestMapping("/test1")
public String doSomething1(Model model) {
String value = "foo";
model.addAttribute("attribute1", value);
return "newUrl";
}
@RequestMapping("/test2")
public String doSomething2(Model model, Device device) {
if (device.isNormal()) {
// do stuff
}
return "newUrl";
}
}
Test:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT)
@WithMockUser(username="admin", authorities = {"ALL"})
public class MyControllerTest {
private MockMvc mockMvc;
@InjectMocks
private MyController controllerUnderTest;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/classes/templates");
viewResolver.setSuffix(".html");
this.mockMvc =
MockMvcBuilders.standaloneSetup(this.controllerUnderTest)
.setViewResolvers(viewResolver)
.build();
}
@Test
public void doSomething1Test() throws Exception {
this.mockMvc.perform(get("/home/test1"))
.andExpect(status().isOk())
.andExpect(model().attribute("attribute1", contains("foo")));
}
@Test
public void doSomething2Test() throws Exception {
this.mockMvc.perform(get("/home/test2"))
.andExpect(status().isOk()));
}
}
Haben Sie es gelöst? Ich bin in der gleichen Situation du warst, ich kann das Gerät nicht in die Unit-Tests injizieren .. – johncol
Nein, aber lass mich wissen, wenn du eine Lösung findest. – Infire