我的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的帮助下单独测试它。如何实现它?
答案 0 :(得分: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
}
测试独占控制器层并将整个加载的上下文专门限制为它。例如:
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = Controller.class)
public class ControllerTest{
@Autowired
private MockMvc mvc;
@MockBean
private ServiceForController service;
//testing methods and their logic
...
}
即使第二种方法在使用的资源方面似乎更合理(由于我而言),但由于缺少初始化的bean,可能会造成许多不便。例如,在我决定尝试另一个选项之前,我需要创建至少5个bean的模拟,这些bean在我的ContollerTest类中添加到SpringBoot start的上下文中。
因此,我不得不切换到使用@SpringBootTest与@SpyBean结合的方法,这允许我调用Mockito verify()方法。