如何为JUnit测试动态加载不同的类?

时间:2016-04-08 08:21:14

标签: spring junit spring-annotations

我已经编写了几个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(正如你在测试中看到的那样)。当我测试这个本地时,我只需用这个存根替换真正的类。这是如何动态完成的?

1 个答案:

答案 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")));
    }
}