我正在编写一个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。当我到达代码中请求的调用站点时,默认的
类不会被模拟。我做错了什么?
事实证明,Mockito
的功能不足以完成我认为它可以完成的事情。正确的解决方案是使用PowerMockito来模拟构造函数soClient。默认值
在包含该引用的类中实例化模拟实例时,返回模拟实例。
在经历了大量的编译错误之后,我得到了PowerMockito
进行编译,它似乎可以正常工作。唉,它没能回复我的模拟,通话仍在进行。过去我试过PowerMockito
,但由于它带来了额外的问题,我从来没有使用过它。所以我仍然认为,只需即插即用并不是一件超级容易的事。
很遗憾试图做这样的事情太难了。
如前所述,莫奇托不够强大。我用手动模拟解决了这个问题。
这比听起来容易:
我的服务。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(),后者不会考虑系统属
这是原样代码。 我用假客户机修改了代码。像这样。 从功能上来说,没有问题。 有人帮忙吗,拜托。谢谢!