如何为 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")));
    }
}