【问题标题】:How to require that JUnit tests implement a @BeforeClass/@AfterClass "abstract method"?如何要求 JUnit 测试实现 @BeforeClass/@AfterClass “抽象方法”?
【发布时间】:2015-01-01 09:21:32
【问题描述】:

作为一个重度TestNG用户,这不是问题,因为@{Before,After}Class方法不是static...

但在 JUnit 中,它们是。

这对我目前正在做的事情来说是一个相当大的问题。

我正在为 assertj 编写 java.nio.file.Path 的断言,它使用 JUnit 4.x 进行测试。有些断言要求我初始化一个FileSystem(准确地说是memoryfs)来测试它们;理想情况下,这样的文件系统应该在测试类级别而不是每个测试中初始化。并且根据测试类,我需要以不同的方式初始化该文件系统的内容。

不过,我现在使用@Before/@After,因为我不知道更好...

同样,使用 TestNG,没有问题,因为 @{Before,After}Class 不是静态的。那么,您如何使用 JUnit 做到这一点? .

【问题讨论】:

  • 类似问题已经结束 here 并且接受的答案似乎建议使用 testng 或带有@RunWith(MyClass.class) 的hack :(
  • @almasshaikh 嗯,所以你也是 TestNG 用户 ;) 无论如何,在这里我别无选择......我看到一个答案建议一个构造函数,我可能会去。我只是想知道是否会有内置机制。当你使用 TestNG 时,使用 JUnit 真的 感觉就像是倒退了一步:/
  • 反对者请解释
  • @fge 这个问题还很不清楚,似乎过早地得出结论(模板方法方法)。与往常一样,一个具体的代码示例(例如,您将如何在 TestNG 中编写此测试)会有所帮助。
  • 阅读问题的标题和(大部分)正文。这完全是关于您想到的解决方案的实现细节(“@BeforeClass/@AfterClass 抽象方法”、“方法不是静态的”等),而不是解释真正的问题。此外,您没有解释为什么最直接的解决方案(在每个测试类中都有一个 @BeforeClass,没有公共基类)在您的情况下还不够好。 (你甚至没有提到有一个基类;这必须从上下文中推断出来。)当然,读者可以对所有这些事情做出有根据的猜测,但他们不应该这样做。

标签: java junit testng


【解决方案1】:

你可以为你的初始化创建一个规则类:

public class Resource extends ExternalResource {
    protected void before() {
        // ...
    }

    protected void after() {
        // ...
    }
}

然后在每个测试中引用它:

@ClassRule public static Resource resource = new Resource();

可以通过使资源成为匿名内部类和 覆盖方法,或将参数传递给其构造函数。

如果你有一个通用的基类,你可以把resource放在那里,然后只在需要自定义的子类中声明。在junit中,子类中的类规则会覆盖同名父类中的类规则。

【讨论】:

  • 嗯,所以,假设我要创建一个FileSystem;我会在构造函数中创建它,在before() 中设置它并在after() 中关闭它,是这样吗?那我怎么访问呢?我要在实例上创建一个 getter 吗?
  • @fge 可以,在构造函数或者before方法中保存一个实例,并添加一个getter。
  • 好的,它有效。谢谢!但坦率地说,无论谁决定每个班级的测试资源必须是static,都应该在出生时就被杀死。
  • 它必须是静态的,否则将为每个测试方法创建一个单独的规则。
  • @PeterNiederwieser 来自 TestNG 背景,这是一个非常严重的限制;)
猜你喜欢
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多