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

在使用mockMVC进行集成测试时模拟非spring管理的对象

李鸿
2023-03-14

我正在使用MockMvc编写集成测试用例来测试RESTAPI。

在我的RESTAPI实现中,我在内部使用RestTemplate(不是直接来自控制器,而是来自控制器调用的util类)来调用第三方REST API。我使用的RestTemplate(制作第三方rest API)不是一个Spring托管bean,而是我将其实例化为RestTemplate restTemplate=new RestTemplate();

我想模拟restTemplate调用(postForEntity)。

我正在尝试以下方法:

我的测试课-

@ContextConfiguration(locations = {
    "classpath:test-applicationContext.xml"
})
@WebAppConfiguration

公共类MockMVCTest{

  private MockMvc mockMvc;
  private RestTemplate restTemplate

  @Autowired
  private WebApplicationContext webApplicationContext;

  @Before
  public void setUp() {
    if (!initalized) {
     mockMvc =   MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
  restTemplate = (RestTemplate)webApplicationContext.getBean("restTemplate");

}

@Test
public void demo() throws Exception {
 when(
  restTemplate.postForEntity(
    eq("thirdpartyuri"),
    any(HttpEntity.class),
    eq(MyClass.class))).thenReturn(myresponse);

mockMvc.perform(
  post("uriExposedbyme")
    .contentType(MediaType.APPLICATION_JSON)
    .accept(MediaType.APPLICATION_JSON)
    .content(MY_PAYLOAD)).andExpect(status().isOk());
}

在我的应用程序上下文中,我定义了以下mock:

<bean id="restTemplate" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="org.springframework.web.client.RestTemplate" />        </bean>

但是当我执行测试用例时,RestTemplate会被模拟,但是当在执行过程中调用RestTemplate时,会调用实际的RestTemplate,而不是我的模拟RestTemplate。

请建议我如何为我的测试用例模拟RestTemplate。

共有2个答案

宰父智敏
2023-03-14

根据提供的信息,我可以说尝试以下更改,并检查是否解决了您的问题。我看到的是,由于您将WebApplicationContext自动连接为

@Autowired private WebApplicationContext webApplicationContext;

可能会注入开发配置文件,而不是测试配置文件。因此,您能否将此注释标记为测试类顶部的测试配置文件中的类

@RunWith(SpringJUnit4ClassRunner.class) 

尽管如此,如果您有问题,请将rest模板与RestTemplate实例正确连接,如下所示。

@Autowired
@Qualifier("restTemplate")
private RestTemplate restTemplate;
呼延辰龙
2023-03-14

util类实例化它的私有RestTemplate,就像您说的:RestTemplate restTemplate=new RestTemplate();。

这意味着它将使用它,而不是测试中模拟的那个。您可以在实际代码中使RestTemplate成为spring管理的bean,或者在util类上有一个setter方法,并在测试中使用模拟的rest模板调用该setter。

 类似资料:
  • 我有以下测试类: 这将导致HTTP 200而不是401。我启用了组件扫描和自动配置,并在我的SecuityConfiguration类中配置了Spring Security性,如下所示: 如果我使用RestTemplate访问,那么我将获得预期的行为(HTTP 401)。 null 因此,我不希望手动添加安全过滤器链,因为我(不正确?)期望这“只是工作”由于自动配置魔术在Spring引导? 提前谢

  • 如何模拟集成测试所需的许多依赖关系? 我使用Mockito进行纯单元测试。在这种情况下,Pure意味着测试一个类,嘲笑它的所有依赖关系。漂亮。 现在是集成测试。假设在这种情况下,集成测试将测试以下内容: 消息被放入队列 我们也可以说,在第2步中发生的处理是严肃的事情。它依赖于大量的数据库交互、多种外部服务、文件系统,以及各种各样的东西。流还会引发很多副作用,所以我不能简单地确保响应是正确的——我需

  • 我正在尝试将Spring Boot应用程序的一些集成测试从迁移到。目前,测试使用的是 当测试运行时,被配置为使用与服务器运行时相同的基本URL和(随机选择的)端口。 在我的一个测试中,我登录并保存authorization-response头值,以便在后续的API调用中使用。我试着将它迁移到,就像这样 但是当我像这样创建实例时,它没有配置为使用与应用程序相同的端口。 我尝试使用的依赖注入实例 这确

  • Spring对MockMvc有2个设置: 独立设置 WebApplication Context安装 一般来说,MockMvc用于哪种测试?单元还是集成?或者两者兼而有之? 使用独立设置(运行在Spring应用程序上下文之外)允许您编写单元测试,而使用WebApplication Context设置您可以编写集成测试,这是对的吗?

  • 我想用Mock for Spring Boot制作一个测试用例,但我无法连接到授权服务器: 我的控制器: 这是我的测试,但取一个错误NullPointer,可能是因为在方法中有一个参数(OAuth2Authentication auth),我不知道如何将其放入测试中:

  • 全部的 我有一个在go中编写的服务,它通过gRPC协议与其他几个服务进行通信。我想为我的服务编写集成测试,但是我不可能使用真正的依赖项。 所以,我需要以某种方式模拟依赖关系。 对我来说,一个完美的场景是这样的: 我可以运行模拟服务器,并将其地址而不是真正的依赖项传递给我的应用程序 我试着用https://github.com/jekiapp/gripmock但它并不支持所有protobuff语法。