2017-05-03 137 views
0

我有一個基本的SpringBoot應用程序。使用Spring初始化程序,嵌入式Tomcat,Thymeleaf模板引擎和包作爲可執行JAR文件。Spring Boot - MockMVC測試不起作用

我有這樣的控制器:

@Controller 
@RequestMapping("/deviceevent") 
public class DeviceEventController { 

    @RequestMapping(value={ "/list"}, method = { RequestMethod.GET}) 
    public String deviceeventList() { 

     return "tdk/deviceEvent/DeviceEventList"; 
    } 
} 

和這個其他測試類。使用Spring的MockMVC框架進行測試。該驅動在測試的MVC應用程序,就好像是在一個容器中運行,

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
public class MockMvcTests { 

    // Pull in the application context created by @ContextConfiguration 
    @Autowired 
    private WebApplicationContext wac; 

    private MockMvc mockMvc; 

    @Before 
    public void setup() { 
     // Setup MockMVC to use our Spring Configuration 
     this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); 
    } 


    @Test 
    public void getDeviceEventsTest() throws Exception { 
     this.mockMvc 
       .perform(get("/deviceevent/list") // 
         .accept(MediaType.parseMediaType("text/html;charset=UTF-8"))) 
       .andExpect(status().isOk()) // 
       .andExpect(model().size(1)) // 
    } 

但我得到這個錯誤:

java.lang.AssertionError: Status expected:<200> but was:<404> 
    at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:54) 
    at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:81) 
    at org.springframework.test.web.servlet.result.StatusResultMatchers$10.match(StatusResultMatchers.java:664) 
    at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:171) 
    at com.tdk.iot.web.controllers.MockMvcTests.getDeviceEventsTest(MockMvcTests.java:66) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
+0

你測試看起來不像典型的基於Spring Boot的測試。我期望看到'@ SpringBootTest'或'@ WebMvcTest'。你使用的是什麼版本的Boot? –

+0

@AndyWilkinson WebMvcTest是缺失的部分!請轉換爲答案 –

回答

1

請嘗試這樣的:

@RunWith(SpringRunner.class) 
@WebMvcTest(WarehouseController.class) 
public class WarehosueControllerTest { 

    @Autowired 
    private MockMvc mvc; 


    @MockBean 
    WarehouseService warehouseService;//the business service 



    @Test 
    public void testGetWarehouses() throws Exception{ 
     List<Long> list = new ArrayList<>(); 
     list.add(1L); 

     WarehouseDTO warehouseDTO = new WarehouseDTO(); 
     List<WarehouseDTO> warehouseDTOs = new ArrayList<>(); 
     warehouseDTO.setId(1L); 
     warehouseDTO.setCode("test_code"); 
     warehouseDTO.setName("test_name"); 
     warehouseDTO.setAddress("adress value"); 
     warehouseDTOs.add(warehouseDTO); 
     given(this.warehouseService.getWarehouses(0, list)) 
       .willReturn(warehouseDTOs); 

     this.mvc.perform(get("/api/warehouses?filterType=0&ids=1") 
       .header("Accept-Language", "en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4") 
       .accept(MediaType.APPLICATION_JSON_UTF8)) 
       .andExpect(status().isOk()) 
       .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) 

       //check if the jason node exsits 
       .andExpect(jsonPath("$.errorCode").exists()) 
       .andExpect(jsonPath("$.payload[0].name").exists()) 
       .andExpect(jsonPath("$.payload[0].code").exists()) 
       .andExpect(jsonPath("$.payload[0].id").exists()) 

       //check the type of json node 
       .andExpect(jsonPath("$.errorCode").isString()) 
       .andExpect(jsonPath("$.payload[0].name").isString()) 
       .andExpect(jsonPath("$.payload[0].code").isString()) 
       .andExpect(jsonPath("$.payload[0].id").isNumber()) 

       //check the return value 
       .andExpect(jsonPath("$.errorCode").value("")) 
       .andExpect(jsonPath("$.payload[0].name").value("test_name")) 
       .andExpect(jsonPath("$.payload[0].code").value("test_code")) 
       .andExpect(jsonPath("$.payload[0].address").value("adress value")) 
       .andExpect(jsonPath("$.payload[0].id").value(1)); 
    } 
} 
相關問題