我正在使用spring Cloud的eureka和feign在一些服务之间进行通信(比如A和B)。现在我想统一测试一个服务(a)的服务层。问题是,这个服务(A)正在使用一个假客户机来请求其他服务(B)的一些信息。
编辑:我最终为虚假客户机创建了一个存根。存根被标记为主要组件,以强制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;
}
}
问题是...你需要嘲笑吗?我经常看到人们提到“mock”作为任何“不应该成为单元测试一部分”的第一个解决方案。嘲笑是一种技巧,不是解决一切的方法。(见这里)。
如果您仍处于代码的早期阶段,只需重构并使用其他东西,而不是依赖于虚假客户机的具体实例。您可以使用接口、抽象类、特征或任何您想要的东西。不要依赖对象本身,否则就得“嘲弄它”。
public interface IWebClient {
public String get(...);
public String post(...);
}
对于这个问题:但是我会有其他代码来做完全相同的事情(除了它将在Feign的具体实例上),那么我该怎么办呢?嗯,您可以编写一个功能测试并调用一个可以在本地设置的web服务器实例--或者使用Wiremock,正如Marcin Grzejszczak在其中一个答案中提到的那样。
public class FeignClientWrapper implements IWebClient {
private feign = something
public String get() {
feign.get( ... )
}
public String post() {
feign.post( ... )
}
}
单元测试用于测试算法,if/else循环:单元是如何工作的。不要为了模仿而编写代码--必须反过来:您的代码应该有较少的依赖关系,并且只有在需要验证行为时才应该模仿(否则可以使用存根或假对象):您需要验证行为吗?您需要测试在代码中调用特定方法吗?或者一个特定的方法用X,Y和Z连续调用3次?嗯,那么是的,嘲笑也可以。
否则,使用一个假对象:您想要测试的只是调用/响应,也许还有状态代码。您可能只想测试代码如何对不同的输出(例如,JSON响应中是否存在字段“error”)、不同的状态代码(假设客户机文档是正确的:GET时为200OK,POST时为201,等等)做出反应。
我能够让eureka服务器以点对点模式运行。但我很好奇的一件事是如何让服务发现客户端注册到多个eureka服务器。 我的用例如下:<br>假设我有一个服务注册到其中一个eureka服务器(例如服务器a),并且该注册被复制到它的对等服务器。服务实际上指向服务器A。如果服务器A停机,客户机希望与服务器A续费,如果服务器A不再存在,续费如何工作。我是否需要同时向这两个服务器注册?如果不是,那么如果客户端
我在docker容器中使用Spring Cloud,因此在一个容器中有一个Eureka服务器,在另一个容器中有一个Eureka客户机。我的问题是容器启动的顺序,如果客户端在eureka服务器之前启动,那么我会在日志中得到很多异常,例如。 在eureka服务器启动后,客户端成功注册,然而,有没有一种方法来配置客户端不以这种方式失败,并用异常填充日志,它可以静默失败吗?
我有一个错误,当我注入feignClient接口在我的服务。这是我使用的Spring引导和Spring云版本: 组织。springframework。启动:spring启动程序父级:2.0.6。发布spring云版本:Finchley。SR2 但是当我在我的类服务中创建一个虚假客户端bean时,它就工作了。 创建客户外部客户端: 我把这个假冒的客户注入军队 输出
pom.xml 主应用程序类 Application.Properties eureka客户端设置 pom.xml Application.Properties 我在eureka-server仪表板(http://localhost:8761)中没有看到向Eureka server注册的micro-service-currency-exchange-service 为什么eureka客户端没有注册
我有一个Spring Boot应用程序,它充当Eureka客户机。该应用程序需要通过REST调用另一个微服务,我希望使用Feign进行此调用。我遇到的问题是,我的应用程序试图在Eureka中查找服务名称,而它仅在我的应用程序yaml文件中定义。 我为难以理解的解释道歉,希望下面的代码片段将有助于澄清。 外国客户: 在我的控制器中,谁调用这个费恩客户端,使用@AutoWired定义了foServic