2017-05-15 2 views
0

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())); 
    } 
} 
+0

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

+0

Nein, aber lass mich wissen, wenn du eine Lösung findest. – Infire

Antwort

0

Dies ist, wie ich für verschiedene Gerätetypen getestet haben, wenn der Frühling Mobil verwenden. Es ist nicht genau das, was du gefragt hast. Könnte eine andere Möglichkeit bieten, dasselbe Problem zu behandeln.

@Test 
public void getSpringMobileDesktopView() throws Exception { 
    this.mockMvc.perform(get(url) 
      .header("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36") 
      .accept(MediaType.TEXT_HTML)) 
      .andExpect(view().name(containsString("desktop"))) 
      .andExpect(status().isOk()) 
      .andExpect(content().contentType(mediaTypeHtml)) 
      .andExpect(content().string(containsString(contains))); 
} 

@Test 
public void getSpringMobileTabletView() throws Exception { 
    this.mockMvc.perform(get(url) 
      .header("user-agent", "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25") 
      .accept(MediaType.TEXT_HTML)) 
      .andExpect(view().name(containsString("tablet"))) 
      .andExpect(status().isOk()) 
      .andExpect(content().contentType(mediaTypeHtml)) 
      .andExpect(content().string(containsString(contains))); 
} 

@Test 
public void getSpringMobileMobileView() throws Exception { 
    this.mockMvc.perform(get(url) 
      .header("user-agent", "Mozilla/5.0 (iPhone; U; ru; CPU iPhone OS 4_2_1 like Mac OS X; ru) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5") 
      .accept(MediaType.TEXT_HTML)) 
      .andExpect(view().name(containsString("mobile"))) 
      .andExpect(status().isOk()) 
      .andExpect(content().contentType(mediaTypeHtml)) 
      .andExpect(content().string(containsString(contains))); 
} 
Verwandte Themen