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

在Spock中模拟RestOperations.Exchange(使用varargs重载方法)

查淮晨
2023-03-14

我试图在Spock中模拟org.springframework.web.client.restoperations.exchange。斯波克失败了

Too few invocations for:

1 * restOperations.exchange("https://test.com", HttpMethod.POST, _ as HttpEntity, String)   (0 invocations)

Unmatched invocations (ordered by similarity):

1 * restOperations.exchange('https://test.com', POST, <whatever,[]>, class java.lang.String, [])

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.web.client.RestOperations;

public class MySubject {
    private final RestOperations rest;

    public MySubject(RestOperations rest) {
        this.rest = rest;
    }

    public void doStuff() {
        HttpEntity<String> httpEntity = new HttpEntity<>("whatever");
        rest.exchange("https://test.com", HttpMethod.POST, httpEntity);
    }
}

MyTest.groovy:


import org.apache.http.HttpEntity
import org.springframework.http.HttpMethod
import org.springframework.web.client.RestOperations
import spock.lang.Specification

class MyTest extends Specification {
    RestOperations restOperations = Mock(RestOperations)
    MySubject subject = new MySubject(restOperations)

    def "test"() {
        when:
        subject.doStuff()
        then:
        1 * restOperations.exchange("https://test.com", HttpMethod.POST, _ as HttpEntity, String)
    }
}

共有1个答案

柯英奕
2023-03-14

您有多个问题:

>

  • 在应用程序中导入org.springframework.http.httpentity,在测试org.apache.http.httpentity。你需要纠正这一点。

    应用程序中调用rest.exchange(“https://test.com”,httpmethod.post,httpEntity);甚至不能编译,因为restoperations类中没有这样的签名。您需要添加参数string.class

    在测试中,您需要反映包括varargs在内的方法签名,即真正的方法签名有5个参数。

    如果您解决了所有这些问题,您的测试将顺利运行:

    package de.scrum_master.stackoverflow.q61135628;
    
    import org.springframework.http.HttpEntity;
    import org.springframework.http.HttpMethod;
    import org.springframework.web.client.RestOperations;
    
    public class MySubject {
      private final RestOperations rest;
    
      public MySubject(RestOperations rest) {
        this.rest = rest;
      }
    
      public void doStuff() {
        HttpEntity<String> httpEntity = new HttpEntity<>("whatever");
        rest.exchange("https://test.com", HttpMethod.POST, httpEntity, String.class);
      }
    }
    
    package de.scrum_master.stackoverflow.q61135628
    
    import org.springframework.http.HttpMethod
    import org.springframework.web.client.RestOperations
    import spock.lang.Specification
    
    class MyTest extends Specification {
      RestOperations restOperations = Mock()
      MySubject subject = new MySubject(restOperations)
    
      def "test"() {
        when:
        subject.doStuff()
    
        then:
        1 * restOperations.exchange("https://test.com", HttpMethod.POST, _, String, _)
        // Or if you want to be more specific:
    //  1 * restOperations.exchange("https://test.com", HttpMethod.POST, _, String, [])
      }
    }
    

  •  类似资料:
    • 1)创建groovy项目 2)创建接口: 3)创建spock测试: 有没有更好的方法来“解释”spock被模仿函数的最后一个参数是vararg,因此可以省略它?

    • 我有两个重载的方法,分别是varargs int和long。当我运行一个传递整数的测试时,它似乎更喜欢varargs long方法。然而,如果我使这些方法是静态的并使用整数运行,它似乎更喜欢varargs int方法。这是怎么回事? 产出: 内长varargs 1 内部静态int varargs 1

    • 所以我想做一些事情 但我得到了空异常

    • 问题内容: 以下代码无法编译。 发出编译时错误。 对test的引用是模棱两可的,varargspkg.Main中的方法test(int …)和varargspkg.Main中的方法test(float …) 这似乎很明显,因为方法调用中的参数值可以提升为 如果任何一个或两个参数都带有或作为后缀,则会进行编译。 但是,如果我们用相应的包装器类型表示方法签名中的接收参数,如下所示 那么对该方法的调用不

    • 但是如果我从ClassUnderTest运行methodUnderTest: 它抛出了一个ClassWithStatic的真实实例,该实例在其实例Method中失败。

    • 注意:这个示例非常简单,但它得到了我想要实现的跨越的想法。 我有一个类(称为),它接受作为构造函数参数;它有一个方法,该方法生成一个执行以下操作的新线程(为简洁起见,大大减少了): 在正常操作中,调用会阻塞,直到与建立连接为止。 但这让我产生了错误的感觉;我不是真的在寻找至少一个互动,我真的在寻找一个互动。 我可以这样做(返回一次模拟的套接字,然后返回null): 但是,我仍然有大量对的调用,这些