当前位置: 首页 > 知识库问答 >
问题:

为Unittesting模拟一个Eureka假客户端

赵永新
2023-03-14

我正在使用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; 
    } 
}

共有1个答案

陶锋
2023-03-14

问题是...你需要嘲笑吗?我经常看到人们提到“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客户端没有注册

  • 我有一个nxt请求帖子与表单url编码使用Feign客户端