当前位置:  开发笔记 > 前端 > 正文

模拟Eureka Feign客户进行单元测试

如何解决《模拟EurekaFeign客户进行单元测试》经验,为你挑选了1个好方法。

我正在使用spring cloud的eureka并假装在一些服务之间进行通信(比方说A和B).现在我喜欢单一测试单个服务的服务层(A).问题是,该服务(A)正在使用假装客户端来请求其他服务的一些信息(B).

在没有任何特殊配置的情况下运行unittes会引发以下异常:java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have available server for client: service-b=>但我不希望任何服务器运行.

我的问题是:有没有办法嘲笑假装客户端,所以我可以在不运行eureka实例和服务(B)的情况下对我的服务(A)进行单元测试?

编辑:我最终为假装客户端创建了一个存根.存根被标记为主要组件,以强制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; 
    } 
}

Markon.. 5

问题是......你甚至需要嘲笑吗?我经常看到人们提到"模拟"作为"不应该成为单元测试的一部分"的任何东西的第一个解决方案.模拟是一种技术,而不是一切的解决方案.(见这里).

如果您仍处于代码的早期阶段,只需重构并使用其他内容,而不是依赖于Feign Client的具体实例.您可以使用接口,抽象类,特征或任何您想要的东西.不要依赖于对象本身,否则你必须"嘲笑它".

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,循环:单元如何工作.不要编写代码来使mocks适合 - 它必须是相反的:你的代码应该具有较少的依赖性,并且你应该只在需要验证行为时进行模拟(否则你可以使用存根或伪对象):你需要验证行为吗?您是否需要测试代码中是否调用了特定方法?或者连续3次使用X,Y和Z调用特定方法?那么,是的,嘲笑是可以的.

否则,使用假对象:你想要的只是测试调用/响应和可能的状态代码.你可能想要的只是测试代码对不同输出的反应(例如,JSON响应中是否存在"错误"字段),不同的状态代码(假设客户端文档是正确的:当GET时为200 OK,201当POST等时).



1> Markon..:

问题是......你甚至需要嘲笑吗?我经常看到人们提到"模拟"作为"不应该成为单元测试的一部分"的任何东西的第一个解决方案.模拟是一种技术,而不是一切的解决方案.(见这里).

如果您仍处于代码的早期阶段,只需重构并使用其他内容,而不是依赖于Feign Client的具体实例.您可以使用接口,抽象类,特征或任何您想要的东西.不要依赖于对象本身,否则你必须"嘲笑它".

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,循环:单元如何工作.不要编写代码来使mocks适合 - 它必须是相反的:你的代码应该具有较少的依赖性,并且你应该只在需要验证行为时进行模拟(否则你可以使用存根或伪对象):你需要验证行为吗?您是否需要测试代码中是否调用了特定方法?或者连续3次使用X,Y和Z调用特定方法?那么,是的,嘲笑是可以的.

否则,使用假对象:你想要的只是测试调用/响应和可能的状态代码.你可能想要的只是测试代码对不同输出的反应(例如,JSON响应中是否存在"错误"字段),不同的状态代码(假设客户端文档是正确的:当GET时为200 OK,201当POST等时).

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有