我正在使用Spring Cloud的Eureka和Feign来在一些服务(比方说A和B)之间进行通信。现在,我想对单个服务(A)的服务层进行单元测试。问题是,该服务(A)使用Feign客户端请求其他服务(B)的某些信息。
在没有任何特殊配置的情况下运行unittests会抛出以下异常:java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have available server for client: service-b
=> 但我不想运行任何服务器。
我的问题是:是否有一种方法可以模拟Feign客户端,以便我可以在不运行Eureka实例和服务(B)的情况下对服务(A)进行单元测试?
编辑:
最终,我创建了一个Feign客户端存根。该存根被标记为主要组件,以强制Spring在我的测试中实例化该存根。
这就是我想出的解决办法。
//the feign client
@FeignClient("user")
public interface UserClient {
UserEntity getUser();
}
//the implementation i use for the tests
@Component
@Primary //mark as primary implementation
public class UserClientTestImpl implements UserClient {
@Override public UserEntity getUser() {
return someKindOfUser;
}
}
@FeignClient("user") public interface UserClient { //一些Feign注释 UserEntity getUser(); }
我用于测试的实现 `@Component @Primary public class UserClientTestImpl implements UserClient {@Override public UserEntity getUser() { return someKindOfUser; }
}`基本上就是你提到的方法@Markon。 - Kamil Szuster