Spock测试框架-如何参数化@Rule资源?

时间:2018-08-30 13:25:08

标签: groovy mocking spock junit-rule

我正在更新Spock测试。几乎没有模拟和@Rule资源:

AuthTokenService mockAuthTokenService = Mock()
ObjectMapper mockObjectMapper = Mock()

GeneralConfiguration conf = Mock();
def CLA_BASE_URL = "http://some-prefix/";

@Rule
ResourceTestRule resource = ResourceTestRule.builder()
    .addResource(new AuthResourceImpl(mockAuthTokenService, mockObjectMapper, conf))
    .build()

对于两种不同的测试,我需要资源具有不同的conf。所以我尝试了

def 'create auth token with configured URL prefix'() {
    setup:
    AuthTokenMetaData authTokenMetaData = buildAuthTokenMetaData()

    when:
    conf.getClaBaseUrl() >> CLA_BASE_URL
    ...

但这没用,因为resource仅创建一次。 所以我不得不添加另一个资源。

GeneralConfiguration conf2 = new GeneralConfiguration().setClaBaseUrl(CLA_BASE_URL);
@Rule
ResourceTestRule resource2 = ResourceTestRule.builder()
        .addResource(new AuthResourceImpl(mockAuthTokenService, mockObjectMapper, conf2))
        .build()

但是感觉有点奇怪,从与Spock的短暂接触中,我相信它对此有更好的解决方法。

如何参数化ResourceTestRule

由于ResourceTestRule的基础实现,它必须是JUnit规则。

2 个答案:

答案 0 :(得分:1)

Spock不提供任何参数化@Rule的机制,因为该规则是在执行数据驱动的功能之前创建的。

答案 1 :(得分:0)

正如伦纳德所提到的,Spock只是一个JUnit,它在与JUnit相同的意义上支持@Rule机制,因此没有特殊的语法。

因此,如果需要两种不同的配置,则可能应该使用两种不同的规则定义,并根据测试的“常规性”提出最适合您的解决方案:

这里是一个例子:

class FirstConfigurationSpecification extends Specification {
   @Rule // config A
}

class SecondConfigurationSpecification extends Specification {
   @Rule // config B
}

// in tests
class MyTestThatRequiresConfigurationA extends FirstConfigurationSpecification {}

// in tests
class MyTestThatRequiresConfigurationB extends SecondConfigurationSpecification {}