【问题标题】:JUnit @Before method ordering in GroovyGroovy 中的 JUnit @Before 方法排序
【发布时间】:2012-07-03 18:14:10
【问题描述】:

我习惯于 JUnit 在子类中运行 @Before 方法之前在超类中运行 @Before 方法。但是,我有一个 Groovy 测试类,它继承自另一个 Groovy 类,它们都包含 @Before 方法;我遇到的问题是测试类中的@Before 方法在其超类中的方法之前运行,并且我从未初始化的变量中获取NPE(超类应该负责这一点)。

超类是这样的:

import groovyx.net.http.RESTClient
import org.junit.Before

abstract class BaseTestClass {
    def client

    @Before
    void setUp() {
        client = new RESTClient()
    }
}

子类是这样的:

import org.junit.Before

class TestClass extends BaseTestClass {

    @Before
    void setUp() {
        client.post(path: '/entity', body: '{"id":"test"}')
    }

    ...
}

这是一个简化版本,但我在子类的 setUp() 方法中得到错误:java.lang.NullPointerException: Cannot invoke method post() on null object。任何想法可能导致这种行为?所有的文档都说应该反过来,而我以前从未经历过任何不同。

我正在使用 maven-failsafe-plugin、junit-4.10 和 jdk-1.6.0_31 运行。有趣的是,我在同一个地方(同一个包、同一个项目、同一个目录)有其他 Groovy 测试类,它们没有遇到这个问题——@Before 方法的顺序是正确的;此外,它似乎是确定性的——总是同一个测试类有问题。

谢谢!

【问题讨论】:

    标签: groovy junit annotations


    【解决方案1】:

    您将两个@Before 方法都命名为setUp()。孩子的setUp() 方法覆盖了父母的方法。所以client = new RESTClient() 这条线永远不会被调用。

    只需选择另一个名字。

    【讨论】:

    • ...或明确致电super.setUp()
    • 我认为最好选择一种机制来链接预测试方法:要么依赖 Before 注释并注意将父级的“之前”方法命名为 setUp() 以外的名称,或者依赖继承,让子级覆盖父级的 setUp() 但仅在终端单元测试中使用 Before。
    • 当然!非常感谢。我对层次结构进行了一些重构,并错过了超类和子类最终使用相同的方法名称,我傻了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2020-07-08
    • 2017-08-28
    • 2017-10-01
    • 1970-01-01
    • 2017-10-07
    • 2012-05-11
    相关资源
    最近更新 更多