![](/img/trans.png)
[英]Spring Webflux Mockito - mock the response of a Webclient call
[英]Mock the response of a webservice using Spring 3.2 and Mockito
在我正在使用的应用程序中,我们必须使用Web服务中的一些数据,对其进行处理,然后将其发送到前端。 现在,我正在尝试编写一个集成测试,该测试必须检查发送到前端的值的正确性。
我能够执行以下操作加载应用程序上下文:
@Inject
private WebApplicationContext wac;
@BeforeMethod
public void setup() throws Exception {
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
.addFilters(this.springSecurityFilterChain).build();
}
在那之后,如果我做类似的事情:
mockMvc.perform(get("/url"))
.andDo(print())
.andExpect(status().isOk())
它工作得很好,我得到的响应与浏览器的响应相同。
要使用其他API的数据,我使用RestTemplate.getForObjetct
方法。 因此,我想知道是否有一种方法可以拦截对此方法的调用并模拟答案。
我要编写几个新类RestTemplateWrapper
和RestTemplateWrapperFactory
。 前者应该在内部包含一个RestTemplate
,并且只公开要与之交互的RestTemplate
那些部分,包括getForObject
。 要实例化RestTemplateWrapper
,您将使用RestTemplateWrapperFactory
。
现在,应该重构任何创建RestTemplate
对象的类,以允许注入RestTemplateWrapperFactory
,并且只能与它创建的RestTemplateWrapper
对象进行交互。
当谈到时间来检验,你会使用一个模拟框架,如或的Mockito EasyMock的创建一个模拟RestTemplateWrapperFactory
,所以它创建的嘲笑存根它RestTemplateWrapper
,与任何行为,你想为getForObject
。 然后将模拟的RestTemplateWrapperFactory
注入到要测试的任何类中。
我认为您应该能够通过在服务实例上使用Mockito @InjectMocks
注释提供RestTemplate
的@Mock
来实现所需的目标,而不必在RestTemplate
周围使用任何包装器。
因此,我建议您的Test类如下所示:
@Inject
private WebApplicationContext wac;
/* Inject your service implementation from your Spring ApplicationContext*/
@InjectMocks
@Inject
private MyService myService;
/* This Mock RestTemplate will be injected into your service instance by Mockito */
@Mock
private RestTemplate restTemplate;
@BeforeMethod
public void setup() throws Exception
{
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
.addFilters(this.springSecurityFilterChain).build();
}
这里实际上发生了什么:
@Mock
实现在测试环境中创建Mock RestTemplate
实例。 @InjectMocks
批注放置在MyService实现上对Mockito说:“在可能的情况下将Mocks注入此实例” RestTemplate
注入您的服务实例 然后,您可以继续编写测试正常,然后使用到的Mockito的,假装操作RestTemplate
并验证它们如
@Test
public void testServiceUsesRestTemplateProperly()
{
Mockito.when(restTemplate.getForObject("http://example.com", String.class)).thenReturn("hello world");
String s = myService.doSomething();
Assert.assertEquals("hello world", s);
Mockito.verify(restTemplate).getForObject("http://example.com", String.class);
}
(很抱歉,如果我在这里混用了jUnit语法)
更多信息值得阅读:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.