SpringBoot应用程序中的控制器层测试

时间:2017-10-13 11:29:38

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

我的SpringBoot应用程序中有一个控制器:

@Controller  
@RequestMapping("/v1/item")  
public class Controller{

@Autowired
private ServiceForController service;

@PostMapping()
public String createItem(@ModelAttribute Item item) {
        Item i = service.createItem(item.getName(), item.getDomain());
        return "item-result";
    }
}

我想在mock的帮助下单独测试它。如何实现它?

1 个答案:

答案 0 :(得分:1)

至少有两种方法可以做到:

  1. 启动整个SpringBoot上下文并进行一些集成测试 例如:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @AutoConfigureMockMvc
    public class ControllerTest {
       @Autowired
       private MockMvc mvc;
    
       @Test
       @WithMockUser(roles = "ADMIN")
       public void createItem() throws Exception {
          mvc.perform(post("/v1/item/")
                .param("name", "item")
                .param("domain", "dummy.url.com"))
                .andExpect(status().isOk());
          //check result logic
    }
    
  2. 测试独占控制器层并将整个加载的上下文专门限制为它。例如:

    @RunWith(SpringRunner.class)
    @WebMvcTest(controllers = Controller.class)
    public class ControllerTest{
       @Autowired
       private MockMvc mvc;
    
       @MockBean
       private ServiceForController service;
       //testing methods and their logic
    ...
    }
    
  3. 即使第二种方法在使用的资源方面似乎更合理(由于我而言),但由于缺少初始化的bean,可能会造成许多不便。例如,在我决定尝试另一个选项之前,我需要创建至少5个bean的模拟,这些bean在我的ContollerTest类中添加到SpringBoot start的上下文中。

    因此,我不得不切换到使用@SpringBootTest与@SpyBean结合的方法,这允许我调用Mockito verify()方法。