公司突然要求写测试用例,然后我在网上查阅了相关资料,主要为jmockit和
mockito
两种方式,后来种种尝试后觉得jmockit更上手,于是后期一直沿用,各种得心应手。但是最近某个业务需要内部调用另一个工程的接口,结果就一直卡在这里了。
业务类IopActivitySVImpl部分代码如下:
@Autowired
private CapabilityFeignClient capabilityFeignClient;
String activityId = req.getActivityId();
String dealComment = req.getDealComment();
AuditResultFeedbackReq resultFeedbackReq = getAuditResultFeedbackReq(activityId, dealType, req.getDealComment(), actInfo.getFlow());
capabilityFeignClient.auditIopActivity(resultFeedbackReq);
然后我在测试类IopActivityControllerTest里面是这样mock:
//调用外部接口进行mock
@Autowired
private CapabilityFeignClient capabilityFeignClient;
new Expectations(capabilityFeignClient){
{
capabilityFeignClient.auditIopActivity(withAny(new AuditResultFeedbackReq()));
result = resultFeedbackResp;
}
};
执行覆盖率后报错,new Expectations(capabilityFeignClient) 不支持接口类型的录制
于是我又创建了一个CapabilityFeignClient的实现类capabilityFeignClientStub,并给了别名,如下:
@Component("capabilityFeignClient")
public class CapabilityFeignClientStub implements CapabilityFeignClient {
方法返回null, 此处代码省略。。。
}
然后在CapabilityFeignClient接口的注解里加上 “qualifier”属性,值为上面的实现类别名
@FeignClient(value = "capability-manager-mp", qualifier = "capabilityFeignClient")
public interface CapabilityFeignClient {
代码省略..
}
最后在测试类IopActivityControllerTest和业务类IopActivitySVImpl中注入
@Autowired private CapabilityFeignClient capabilityFeignClient的地方又追加了@Qualifier("capabilityFeignClient")
变为:
@Autowired
@Qualifier("capabilityFeignClient") --此注解为追加,与feign实现类的别名保持一致
private CapabilityFeignClient capabilityFeignClient;
但是最后执行测试类覆盖率时还是失败了,这次报错原因是,业务代码走到调用feign时未执行我预期录制的代码块(new Expectations(capabilityFeignClient){}里面的内容)
一直尝试,一直不成功,困扰了我好几天了,求大佬帮忙看一下。