繁体   English   中英

使用Spring 3.2和Mockito模拟Web服务的响应

[英]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方法。 因此,我想知道是否有一种方法可以拦截对此方法的调用并模拟答案。

我要编写几个新类RestTemplateWrapperRestTemplateWrapperFactory 前者应该在内部包含一个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();
}

这里实际上发生了什么:

  1. 您可以正常构建ApplicationContext
  2. 您将从ApplicationContext注入对服务实现的引用到测试中
  3. 您可以使用Mockito中的@Mock实现在测试环境中创建Mock RestTemplate实例。
  4. @InjectMocks批注放置在MyService实现上对Mockito说:“在可能的情况下将Mocks注入此实例”
  5. Mockito将Mock 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语法)

更多信息值得阅读:

  1. InjectMocks文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM