如何为 JUnit 测试动态加载不同的 class?
How to dynamically load different class for JUnit tests?
我编写了几个 JUnit 测试来测试我的 REST 功能。因为我只想测试 REST(而不是数据库、域逻辑……),所以我制作了一个带有虚拟数据的存根 filles,它代表后端的其余部分。
[编辑] 例如我想测试 /customers/all
将使用包含所有名称的数组列表响应 GET 请求。
因此我使用 MockMV。
this.mockMvc.perform(get("/customers/all").accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$").isNotEmpty())
.andExpect(jsonPath("$[0].name", is("John")));
当您通常向 /customers/all 执行 GET 请求时,将向数据库发送一个请求。现在,为了测试我的 REST 控制器,我制作了一个存根,它使用一个仅包含我的名字的简单数组列表来响应 GET /customers/all(如您在测试中所见)。当我测试这个本地时,我只是用这个存根替换真正的 class 。这是如何动态完成的?
我不认为你的方法是好的。只需使用您的真实控制器,但将其依赖项存根(例如使用 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")));
}
}
我编写了几个 JUnit 测试来测试我的 REST 功能。因为我只想测试 REST(而不是数据库、域逻辑……),所以我制作了一个带有虚拟数据的存根 filles,它代表后端的其余部分。
[编辑] 例如我想测试 /customers/all 将使用包含所有名称的数组列表响应 GET 请求。
因此我使用 MockMV。
this.mockMvc.perform(get("/customers/all").accept("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$").isNotEmpty())
.andExpect(jsonPath("$[0].name", is("John")));
当您通常向 /customers/all 执行 GET 请求时,将向数据库发送一个请求。现在,为了测试我的 REST 控制器,我制作了一个存根,它使用一个仅包含我的名字的简单数组列表来响应 GET /customers/all(如您在测试中所见)。当我测试这个本地时,我只是用这个存根替换真正的 class 。这是如何动态完成的?
我不认为你的方法是好的。只需使用您的真实控制器,但将其依赖项存根(例如使用 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")));
}
}