我已经编写了几个JUnit测试来测试我的REST功能。因为我只想测试REST(而不是数据库,域逻辑,...),我用虚拟数据创建了一个存根文件,代表后端的其余部分。
[编辑]例如我想测试/ customers / all GET请求将被包含所有名称的arraylist响应。
因此我使用了MockMV。
this.mockMvc.perform(get("/customers/all").accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$").isNotEmpty())
.andExpect(jsonPath("$[0].name", is("John")));
当您正常对/ customers /所有人发出GET请求时,请求将被发送到数据库。现在,为了测试我的REST控制器,我创建了一个存根,它使用一个只包含我名字的简单arraylist响应GET / customers / all(正如你在测试中看到的那样)。当我测试这个本地时,我只需用这个存根替换真正的类。这是如何动态完成的?
答案 0 :(得分:2)
我认为你的方法不是好方法。只需使用您的真实控制器,但保留其依赖关系(例如,使用Mockito),就像您在传统的单元测试中所做的那样。
一旦你有一个使用存根依赖关系的控制器实例,你可以使用一个独立的设置并使用MockMvc来测试,除了控制器代码,映射注释,JSON编组等。
在the documentation中描述了Thias方法。
使用Mockito的示例,假设控制器委托给CustomerService:
public class CustomerControllerTest {
@Mock
private CustomerService mockCustomerService;
@InjectMocks
private CustomerController controller;
private MockMvc mockMvc;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
}
@Test
public void shouldListCustomers() {
when(mockCustomerService.list()).thenReturn(
Arrays.asList(new Customer("John"),
new Customer("Alice")));
this.mockMvc.perform(get("/customers").accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$").isNotEmpty())
.andExpect(jsonPath("$[0].name", is("John")));
}
}