【问题标题】:Spock test framework - how to parametrize a @Rule resource?Spock 测试框架 - 如何参数化 @Rule 资源?
【发布时间】:2018-08-30 13:25:08
【问题描述】:

我正在更新 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 规则。

【问题讨论】:

    标签: groovy mocking spock junit-rule


    【解决方案1】:

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

    【讨论】:

    • 所以没有办法在资源上放一个 Mock ?像 Future 这样的东西可以解决吗?
    • 通常在实际测试开始之前执行规则,因此解析已经发生。
    【解决方案2】:

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

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

    这是一个例子:

    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 {}
    

    【讨论】:

    • 这基本上就是我在示例中的内容:)
    猜你喜欢
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2019-09-03
    • 2013-11-27
    • 1970-01-01
    • 2012-05-02
    相关资源
    最近更新 更多