【问题标题】:JUnit5 Spock 2, @ExtendWith does not workJUnit5 Spock 2,@ExtendWith 不起作用
【发布时间】:2020-04-16 13:16:32
【问题描述】:

我正在尝试为我们的新项目建立测试平台。 我们想将 Spock 2 与 JUnit 5 一起使用。

现在我想在基于 Spock 的测试中使用 @ExtendWith 注释。

这是一个例子:

@SpringBootTest(classes = ExtensionTest.class)
@ExtendWith(ClassExtension.class)
class ExtensionTest extends Specification {
    void "test"() {
        when:
        true

        then:
        noExceptionThrown()
    }
}

Given Extension (ClassExtension) 正在实现接口:BeforeAllCallbackAfterAllCallback

class ClassExtension implements BeforeAllCallback, AfterAllCallback {
    @Override
    void beforeAll(ExtensionContext extensionContext) throws Exception {
       ...
    }

    @Override
    void afterAll(ExtensionContext extensionContext) throws Exception {
       ...
    }
}

不幸的是,它不起作用。扩展程序未运行。

我做错了什么?

【问题讨论】:

    标签: testing spock junit5


    【解决方案1】:

    Spock 2.x 不使用 Jupiter 引擎,但基于 Jupiter API 实现了自己的SpockEngine 和自己的SpockExecutionContext。很明显它不支持 Jupiter 扩展,可能是因为 Spock 有自己的注解驱动和全局扩展的扩展机制。

    底线:我建议将您的 JUnit Jupiter 扩展移植到 Spock 扩展。在那里,您还有更好的方法来挂钩 Spock 生命周期。

    【讨论】:

    • 非常感谢...所以它不起作用...我真的很想使用 JUnit 扩展,因为可以通过调用 SpringExtension.getApplicationContext(extensionContext) 在该扩展中获取 Spring Context 我想使用它在类执行之前为 E2E 测试准备上下文。我知道 spock 有自己的扩展,但不可能在其中获取 SpringContext
    • 我不是 Spring 用户,所以我没有使用它的经验,但是 Spock Spring module 对你来说不够吗?
    • 是的,我很熟悉。也许我的问题不够清楚:我想在 tst 套件之前和之后使用 Spring Context。 Spock 有类似 setupSpec 的方法,但它不允许在其中使用 spring cotnext。这就是为什么我开始寻找不同的东西。
    【解决方案2】:

    线程很旧,但如果有人会搜索类似的问题,现在有一种方法可以将 Junit 5 扩展与 Spock 2 一起使用:spock-junit5

    我没有尝试使用 spring boot 扩展,但它应该可以工作,因为库支持所有必需的 jupiter 扩展接口。

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2018-09-24
      • 2019-02-02
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多