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

如何模仿假装。客户。默认使用Mockito

于捷
2023-03-14

我正在编写一个Dropwizard应用程序,并使用Feign建立客户端呼叫到外部服务。我有定制的编码器和解码器,我正在注册feign。建筑商像这样:

    this.feignBuilder = Feign.builder()
            .contract(new JAXRSContract()) // we want JAX-RS annotations
            .encoder(new JacksonEncoder()) // same as what dropwizard is using
            .decoder(new CustomDecoder())
            .errorDecoder(new CustomErrorDecoder())
            .requestInterceptor(new AuthKeyInterceptor(config.getInterceptor()));

我正在为feign客户机调用编写单元测试,这样我就可以观察feign机器如何处理编码器/解码器覆盖和异常气泡。我现在对用假服务器编写集成测试不感兴趣(这是我看到人们为这种情况编写的最常见的测试类型)。

这应该是直截了当的。我想模拟feign发出请求的时间点,让它返回我的假响应。这意味着我应该模拟调用feign。客户违约执行,这样当它向这个呼叫站点发出请求时,它会返回我的假响应。这个模拟的例子如下:

String responseMessage = "{\"error\":\"bad\",\"desc\":\"blah\"}";
feign.Response feignResponse = FeignFakeResponseHelper.createFakeResponse(404,"Bad Request",responseMessage);
Client.Default mockFeignClient = mock(Client.Default.class);
try {
     when(mockFeignClient.execute(any(feign.Request.class),any(Request.Options.class))).thenReturn(feignResponse);
} catch (IOException e) {
     assertThat(true).isFalse(); // fail nicely
}

不走运。Cleint。当我到达代码中请求的调用站点时,默认的类不会被模拟。我做错了什么?

共有2个答案

唐晗昱
2023-03-14

事实证明,Mockito的功能不足以完成我认为它可以完成的事情。正确的解决方案是使用PowerMockito来模拟构造函数soClient。默认值在包含该引用的类中实例化模拟实例时,返回模拟实例。

在经历了大量的编译错误之后,我得到了PowerMockito进行编译,它似乎可以正常工作。唉,它没能回复我的模拟,通话仍在进行。过去我试过PowerMockito,但由于它带来了额外的问题,我从来没有使用过它。所以我仍然认为,只需即插即用并不是一件超级容易的事。

很遗憾试图做这样的事情太难了。

孔皓
2023-03-14

如前所述,莫奇托不够强大。我用手动模拟解决了这个问题。

这比听起来容易:

我的服务。JAVA

public class MyService{
    //My service stuff      

    private MyFeignClient myFeignClient;

    @Inject //this will work only with constructor injection
    public MyService(MyFeignClient myFeignClient){
        this.MyFeignClient = myFeignClient
    }


    public void myMethod(){
        myFeignClient.remoteMethod(); // We want to mock this method
    }
}

MyFignClient.爪哇

@FeignClient("target-service")
public interface MyFeignClient{

    @RequestMapping(value = "/test" method = RequestMethod.GET)
    public void remotemethod();
}

如果要在模拟假客户端的同时测试上述代码,请执行以下操作:

MyFaignClientMock。JAVA

@Component
public class MyFeignClientMock implements MyFeignClient {

    public void remoteMethod(){
         System.out.println("Mocked remoteMethod() succesfuly");
    }
}

我的服务测试。JAVA

@RunWith(SpringJUnit4ClassRunner.class)
public class MyServiceTest {

    private MyService myService;

    @Inject
    private MyFeignClientMock myFeignClientMock;

    @Before
    public void setUp(){
       this.myService = new MyService(myFeignClientMock); //inject the mock
    }

    //Do tests normally here...
}
 类似资料:
  • 我对假装很陌生。今天就发现吧……当我读到Spring Cloud Feign时,我的第一个问题是:“您如何包装您的Fiign客户机?” 我举个例子。假设我们有2个微服务M1和M2。M2使用来自M1的endpoint。 null 也许我完全错了,请指正。 多谢!拜拜

  • 我有一个自定义UITableViewCell,我想在其中绘制一个垂直分隔符,类似于iOS7中默认的水平分隔符。当前,我在配置单元格时使用此代码: 如图所示,默认分隔符以1像素高度渲染,而我的分隔符以2像素宽渲染。我试着将宽度设置为0.5点,但是这条线根本没有被渲染。 此外,颜色是关闭的,显然不是。在中是否有匹配的颜色常数?编辑:颜色是RGB207,207,210似乎没有在中列出。

  • 我需要多次调用服务(>50次)并聚合响应。因此,我决定使用,使用Async和CustomExecuter(它自己的线程池)来提高速度,而不是等待服务响应。 我在类路径上使用带有ApacheHTTP和Hystrix的feign客户机。我可以看到它有时是工作的,有时我得到例外,因为电路是开放的。

  • 使用Spring云合同验证生产者和消费者之间的合同。在我的消费者控制器中,我正在使用Feign client调用另一个微服务方法来获取一些数据。但是现在在SpringCloud contract中,为这个微服务进行存根调用是不可能的。 使用Spring Cloud与Netflix OSS。

  • 当它调用其他eureka客户机时使用feign。然而,当注册到eureka服务器时,它并不费力。我检查了源代码,发现eureka discovery客户端使用了jersey,jersey调用了http apache客户端。问题是,它使用了SchemeRegistryFactory.createDefault(),它将最终调用SSLContexts.createDefault(),后者不会考虑系统属

  • 这是原样代码。 我用假客户机修改了代码。像这样。 从功能上来说,没有问题。 有人帮忙吗,拜托。谢谢!