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

如何对接受ResponseExtractor和RequestCallback的Spring RestTemplate进行单元测试?

齐磊
2023-03-14

我正在用Groovy开发,并试图为以下使用Spring的RestTemplate编写一个Spock单元测试...

其中包括我的请求回调和响应提取器,以及我的RestTemplate bean的初始化类。我正在使用ResponseExtractor将来自get myurl/的响应流化,并将其复制到一个文件中。RequestCallback只是在请求上设置一些头。

class RestTemplateConfig() {
  @Bean(name = 'myRestTemplate')
  RestTemplate getMyRestTemplate() {
    RestTemplate restTemplate = new RestTemplateBuilder().build()
    return restTemplate
  }
}

class MyClass() {

  @Autowired
  @Qualifier('myRestTemplate')
  RestTemplate restTemplate

  File getFile() {

     ResponseExtractor<Void> responseExtractor = { ClientHttpResponse response ->
       // do something with the response
       // in this case, the response is an input stream so we copy the input stream to a file
       myFile = response.getBody() // roughly, in a psuedocode-ish way
       return null
     }

     RequestCallback requestCallback = { ClientHttpRequest request ->
       request.getHeaders().setAccept([MediaType.APPLICATION_JSON])
     }

     File myFile
     // get my file data
     restTemplate.execute('myurl/', HttpMethod.GET, requestCallback, responseExtractor)
     return myFile
  }
}

特定execute(...)方法的Spring框架文档:https://docs.Spring.io/Spring-framework/docs/current/javadoc-api/org/springframework/web/client/resttemplate.html#execute-java.net.uri-org.springframework.http.httpmethod-org.springframework.web.client.requestcallback-org.springframework.web.client.responseextractor-

我如何模拟这些闭包中发生的事情?具体地说,我对模拟我的响应提取器感兴趣,因为我当前的测试总是将myfile返回为null。

    when:
    // do stuff

    then:
    1 * restTemplate.execute('myurl/, HttpMethod.GET, _, _) // how can I mock out the expected response here?
    0 * _

    myFile != null // this fails because myFile is null

共有1个答案

慎建本
2023-03-14

在您按我的要求更新了示例代码后,我现在可以看得更清楚了。您遇到了一个典型的(非)可测试性问题:您的方法getfile不仅仅是获取文件。它将两个依赖项实例化为局部变量,使它们不可更改,因此整个方法基本上不可测试。

因此,您希望重构以获得更好的可测试性,以便能够使用我在第一个评论中提到的一种测试方法:

  • 如果requestcallbackresponseextractor可以通过构造函数或setter注入,则可以注入mocks。
  • 如果它们是由某种工厂类创建的,可以为该类存根。
  • 如果在被测试的类本身中有工厂方法,则可以对该类使用监视并为工厂方法存根。
 类似资料:
  • 问题内容: 如何在单元测试中测试 hashCode()函数? 问题答案: 每当我覆盖equals和hash代码时,我都会按照Joshua Bloch在“ Effective Java”第3章中的建议编写单元测试。我确保equals和hash代码是自反的,对称的和可传递的。我还确保“不等于”对所有数据成员均正常工作。 当我检查对equals的调用时,我还要确保hashCode的行为符合预期。像这样:

  • 我已经为我的应用程序编写了自定义的JsonSerializer和JsonDeserializer。现在我想为它们编写一些单元测试。

  • 问题内容: 我一直在学习AngularJS,并且在单元测试方面进展非常顺利,但是我遇到了一个棘手的问题。 假设我有一个简单的表格,例如: 如果我正在测试类似控制器的东西,我知道我会这样写(使用Jasmine + Karma): 但是我不知道我需要注入哪些服务,也没有运气在指南或文档中找到有关单元测试的文档。 一个单元如何在Angular中测试表单? 问题答案: 我不认为这是对此类内容进行单元测试的

  • 本文向大家介绍对Angular.js Controller如何进行单元测试,包括了对Angular.js Controller如何进行单元测试的使用技巧和注意事项,需要的朋友参考一下 一、写个简单的Angular App 在开始写测试之前,我们先写一个简单的计算App,它会计算两个数字之和。 代码如下: 二、简单说说里面涉及的一些基本概念: 创建一个 module 什么是angular.modul

  • 问题内容: 如您所知,异常情况下会引发异常。那么如何模拟这些异常呢?我觉得这是挑战。对于此类代码段: 有人有好主意吗? 问题答案: 其他答案已经解决了如何编写用于检查是否引发异常的单元测试的一般问题。但是我认为您的问题实际上是在询问如何获取代码以首先引发异常。 以您的代码为例。在简单的单元测试的环境中,很难在内部引发异常。问题是,为了使异常发生,代码(通常)需要在网络中断的计算机上运行。安排在单元

  • 在探索如何对Kafka流进行单元测试时,我遇到了,不幸的是,这个类似乎被版本(KAFKA-4408)破坏了 对于KTable的问题,是否有一个解决方案? 我看到了“mocked streams”项目,但首先它使用的是,而我使用的是,其次它是Scala,而我的测试是Java/Groovy。 这里的任何关于如何在不需要引导zookeeper/kafka的情况下对流进行单元测试的帮助都将非常棒。 注意: