如何验证递归方法的spock测试where子句中的方法调用

How to verify method calls in where clause of spock test for a recursive method

假设我的 class 是带有递归方法 bar 的 Foo,它调用如下所示的服务

public class Foo
{
    private DataService service;

    public void perform(int count, final SomeObject obj)
    {
        if(count > 0)
        {
            service.refresh(obj);
            count = count- 1;
            perform(count, obj)
        }
    }

}

现在我想验证为不同的输入调用刷新方法的次数,就像这样

@Test
def "test method"()
{
given:
def obj = Mock(SomeObject)

expect:
foo.perform(refreshRequests, inputObj)

where:
refreshRequests | inputObj | 
1               | obj      | 1 * service.refresh(obj)
2               | obj      | 2 * service.refresh(obj)
}

有没有办法实现这样的目标? 提前致谢!

你很接近,这就是你的做法。您基本上只是将交互移动到它所属的 then 块,并使用 refreshRequests 作为预期的调用计数。

refreshRequests * service.refresh(inputObj)

经过一些小修改的完整可运行示例。

public class Foo
{
    private DataService service;

    public void perform(int count, String obj)
    {
        if(count > 0)
        {
            service.refresh(obj);
            count = count- 1;
            perform(count, obj)
        }
    }
}

interface DataService {
    void refresh(String aString)
}

class ASpec extends spock.lang.Specification {

    def "test method"()    {
        given:
        def service = Mock(DataService)
        Foo foo = new Foo(service: service)

        when:
        foo.perform(refreshRequests, inputObj)

        then:
        refreshRequests * service.refresh(inputObj)

        where:
        refreshRequests | inputObj 
        1               | "a" 
        2               | "b"     
    }
}

groovy web console 中尝试。