最近项目组在推动单元测试,要求覆盖率提升到60%,但是很多的业务流程都依赖远程调用(Feign Client),所以测试时,需要mock这些远程调用的行为。
完整示例
- Feign Client接口
@FeignClient(value = "baidu")
public interface BaiduApi {
@GetMapping("index.html")
String index();
}
- 上层业务逻辑
@Component
public class BaiduManager {
@Resource
private BaiduApi baiduApi;
public String getIndex() {
return baiduApi.index();
}
}
- 单元测试
@MockBean
会生成一个Mock对象,并取代已存在的相同类型的单例bean,如果不存在则添加
@SpringBootTest
class BaiduManagerTest {
@Resource
private BaiduManager baiduManager;
@MockBean(name = "com.tenmao.utdemo.BaiduApi")
private BaiduApi baiduApi;
@Test
void getIndex() {
Mockito.when(baiduApi.index()).thenReturn("baidu index");
String index = baiduManager.getIndex();
Assertions.assertEquals("baidu index", index);
}
}
常见错误
- Mock对象并没有取代实际对象:
@MockBean(name = "com.tenmao.utdemo.BaiduApi")
需要设置name为全限定符
网友评论