Spring测试 - 使用模拟控制器测试端点

时间:2016-10-27 13:52:44

标签: spring spring-mvc spring-boot spring-test-mvc

我有一个现有的应用程序,我正在尝试编写单元测试......没有真正的“服务”层。它是controller-> repository->数据库,端点是通过控制器上的注释定义的。我使用的是Spring Boot 1.3.8(不是1.4)。

我想要做的是模拟控制器以返回我可以验证的模拟集合。 INSTEAD正在发生的事情是应用程序正在被引导并且实际数据正在被播种,当我调用端点时,真正的应用程序数据正在返回。所以,我似乎有两个问题:我正在进行数据设置和配置我不想在单元测试中执行,其次,我的模拟控制器被忽略了。它们可能是相关的。任何帮助表示赞赏。感谢。

 @Autowired
    private WebApplicationContext context;
    private MockMvc mockMvc;

    @Mock
    private ApplicationController applicationController = new ApplicationController();

    @Before
    public void setup() {
       MockitoAnnotations.initMocks(this);
       mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
    }

    @Test
    public void contextLoads() {}

    @Test
    public void testEndPoints() throws Exception  {
        Application testApp = TestUtils.generateApplication();
        Mockito.when(applicationController.getApplications()).thenReturn(Arrays.asList(testApp));
        log.info("Verifying applications endpoint is up and running.");

        mockMvc.perform(get("/applications/")).andExpect(status().isOk())
               .andDo(print())
               .andExpect(content().contentType(TestUtils.APPLICATION_JSON_UTF8))
               .andExpect(jsonPath("$.[0].name",is("my_name")));
    }

1 个答案:

答案 0 :(得分:0)

通常在这样的情况下,模拟存储库被注入控制器,以便您可以在存储库上模拟方法,拥有所需的集合,在控制器内部执行一些处理,返回修改后的集合。然后,您的单元测试将验证此处理的集合是否符合预期。

类似的东西:

@Autowired
private ApplicationRepository applicationRepository;
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;

@InjectMocks
private ApplicationController applicationController;

@Before
public void setup() {
   MockitoAnnotations.initMocks(this);
   mockMvc = MockMvcBuilders.webAppContextSetup(context).build();

   when(applicationRepository.findAllByIds(anyListOf(Long.class))
        .thenReturn(<the collection you want to be processed by controller>);
}