当前位置: 首页 > 知识库问答 >
问题:

如何在Scala中使用JUnit 5的@BeforeAll

上官兴昌
2023-03-14

Junit5引入了@BeforeAll来表示应在当前测试类中的所有测试之前执行带注释的方法。但是它要求方法是静态的。

我的 Scala 测试套件中有以下结构:

class BaseTest extends MockitoSugar {

  @BeforeAll
  def codeNeedeForAllTests() = {   <== this does not work as as it is not static
    println("calling codeNeedeForAllTests")
    // other code
  }
}

以及其他测试类别:

class IndexerTest extends BaseTest {
  @Test
  def add() = {
     //test code
  }
}

所以我希望< code > codeNeedeForAllTests 在所有测试之前被调用,但是问题是< code>@BeforeAll要求方法是静态的,为此我需要将codeNeedeForAllTests作为对象,以便在Scala中拥有静态方法。

现在在Scala中,一个类不能扩展一个对象,并且对象也不能扩展对象。

我还尝试创建BaseTest的伴随对象,但那也不起作用,有什么干净的方法可以做到这一点吗?

共有2个答案

蒙洛华
2023-03-14

您可以使用< code>FunCpec来完成此操作。

package net

import org.scalatest._

class Test extends FunSpec with BeforeAndAfterAll {

    override def beforeAll: Unit = {
        println("beforeAll")
    }

    describe("running a test") {
        println("in describe")

        it("should do something") {
            println("in my test")
            assert(true)
        }
    }
}

如果您要在REPL中测试它:

scala> test
[info] Compiling 1 Scala source to /Users/kmmere/Workspace/Work/scalatest_before/target/scala-2.11/test-classes...
in describe
beforeAll
in my test
[info] Test:
[info] running a test
[info] - should do something
[info] Run completed in 99 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 1 s, completed Oct 19, 2015 4:32:56 PM

别忘了把sclatest的依赖项包含在yerbuild.sbt文件中:

"org.scalatest" %% "scalatest" % "3.2.0-SNAP10" % Test

类FunSpec-促进“行为驱动”的开发风格(BDD),其中测试与指定测试验证的行为的文本相结合。

推荐使用:对于从Ruby的RSpec工具走过来的团队,FunSpec会觉得熟悉和舒服;更一般地说,对于任何喜欢BDD的团队来说,FunSpec的嵌套和温和的结构化文本指南(使用describe和it)为编写规范风格的测试提供了一个优秀的通用选择。

鲁鸿朗
2023-03-14

JUnit Jupiter(也称为JUnit 5)中的< code>@BeforeAll方法不必是< code>static。

您提供的链接是JUnit4。

这个链接是JUnit Jupiter的。

摘录:

指示应在当前类中的所有@Test、@RepeatedTest、@ParameterizedTest和@TestFactory方法之前执行带批注的方法。类似于JUnit 4的@BeforeClass。这种方法是继承的(除非它们被隐藏或覆盖),并且必须是静态的(除非使用“每类”测试实例生命周期)。

并且链接到关于测试实例生命周期的文档。

因此,您应该能够使用@TestInstance(Lifecycle.PER_class)注释测试类,并将@BeforeAll方法声明为非静态。

 类似资料:
  • 问题内容: 如何在Mockito和JUnit 5中使用注入? 在JUnit4中,我可以只使用Annotation。在JUnit5中没有注释吗? 问题答案: 有多种使用Mockito的方法-我将一一介绍。 手动地 无论JUnit版本是什么(或测试框架),都可以使用Works手动创建模拟。 基于注释 使用@Mock -annotation和相应的调用 来创建嘲笑的作品无论JUnit版本(或测试框架,对

  • 如何使用Mockito和JUnit 5的注射? 在JUnit4中,我可以只使用注释。JUnit5中没有注释吗?

  • 版本: 我得到以下错误:

  • 问题内容: 我正在尝试使用字符串方法。但是,如果我将%1,%2等放置在字符串中,则会抛出java.util.UnknownFormatConversionException,指向一个令人困惑的Java源代码片段: 从中我了解到 char是被禁止的。如果是这样,那么我应该对参数占位符使用什么? 我使用Scala 2.8。 问题答案: 尽管所有先前的回答都是正确的,但它们都是Java语言。这是一个Sc

  • 问题内容: 我有以下代码: 如您所见,期望使用lambda表达式。 现在,我正在使用Java库,但是该应用程序是用Scala编写的。如何将Scala lambda传递给Java代码? 我尝试了以下方法: 但是编译器抱怨: 问题答案: 错误消息列出了支持的参数类型。其中之一是: 从错误消息中,您可以看到您提供了以下类型: 根据Kafka 1 javadoc (在Kafka 1.1中不存在),定义为: