Scala 中的参数化单元测试(使用 JUnit4)

发布于 2024-10-07 00:38:16 字数 652 浏览 0 评论 0原文

有没有办法用 Scala 实现参数化单元测试?目前,我在其余程序中使用 JUnit4,并且我想继续仅使用“标准”API。

我找到了 Junit4 with Groovy 的示例,但我在定义 static< 时遇到问题/代码> 零件。可能是,因为我对 Scala 也很陌生 :-)

我目前的速度是

import org.junit.Test
import org.junit.Assert._

import org.junit.runner.RunWith
import org.junit.runners.Parameterized
import org.junit.runners.Parameterized.Parameters

@RunWith(classOf[Parameterized])
class MyTest extends junit.framework.TestCase {

    @Parameters object data {
        ...
    }

    @Parameter ...

    @Test
    def testFunction() = {
    }

Is there a way to implement a parameterized unit test with Scala? Currently I use JUnit4 in the rest of my programs and I would like to continue using only "standard" APIs.

I found an example for Junit4 with Groovy, but I have problems defining the static parts. Could be, because I am also quite new with Scala :-)

I am currently as fas as

import org.junit.Test
import org.junit.Assert._

import org.junit.runner.RunWith
import org.junit.runners.Parameterized
import org.junit.runners.Parameterized.Parameters

@RunWith(classOf[Parameterized])
class MyTest extends junit.framework.TestCase {

    @Parameters object data {
        ...
    }

    @Parameter ...

    @Test
    def testFunction() = {
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

杀手六號 2024-10-14 00:38:16

这确实很麻烦,但它确实有效。我发现了两件重要的事情:伴生对象必须在测试类之后出现,返回参数的函数必须返回AnyRef(或对象)数组的集合。 Any 数组不起作用。这就是我使用 java.lang.Integer 而不是 Scala 的 Int 的原因。

import java.{util => ju, lang => jl}
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
import org.junit.runners.Parameterized.Parameters

@RunWith(value = classOf[Parameterized])
class JUnit4ParameterizedTest(number: jl.Integer) {
    @Test def pushTest = println("number: " + number)
}

// NOTE: Defined AFTER companion class to prevent:
// Class com.openmip.drm.JUnit4ParameterizedTest has no public
// constructor TestCase(String name) or TestCase()
object JUnit4ParameterizedTest {

    // NOTE: Must return collection of Array[AnyRef] (NOT Array[Any]).
    @Parameters def parameters: ju.Collection[Array[jl.Integer]] = {
        val list = new ju.ArrayList[Array[jl.Integer]]()
        (1 to 10).foreach(n => list.add(Array(n)))
        list
    }
}

输出应该符合预期:

Process finished with exit code 0
number: 1
number: 2
number: 3
number: 4
number: 5
number: 6
number: 7
number: 8
number: 9
number: 10

That's quite a nuisance, but it works. Two important things I discovered: companion object must come after test class, the function returning the parameters must return a collection of arrays of AnyRef (or Object). arrays of Any won't work. That the reason I use java.lang.Integer instead of Scala's Int.

import java.{util => ju, lang => jl}
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
import org.junit.runners.Parameterized.Parameters

@RunWith(value = classOf[Parameterized])
class JUnit4ParameterizedTest(number: jl.Integer) {
    @Test def pushTest = println("number: " + number)
}

// NOTE: Defined AFTER companion class to prevent:
// Class com.openmip.drm.JUnit4ParameterizedTest has no public
// constructor TestCase(String name) or TestCase()
object JUnit4ParameterizedTest {

    // NOTE: Must return collection of Array[AnyRef] (NOT Array[Any]).
    @Parameters def parameters: ju.Collection[Array[jl.Integer]] = {
        val list = new ju.ArrayList[Array[jl.Integer]]()
        (1 to 10).foreach(n => list.add(Array(n)))
        list
    }
}

The output should be as expected:

Process finished with exit code 0
number: 1
number: 2
number: 3
number: 4
number: 5
number: 6
number: 7
number: 8
number: 9
number: 10
自由如风 2024-10-14 00:38:16

使用 ScalaTest 或 Specs 可能会更好。后者绝对支持参数化测试,并且在 Scala 社区中广泛使用。 JUnit 的参数化测试语法非常糟糕,而且它对静态声明的依赖不会让你在 Scala 中的任务变得更容易(可能你需要一个伴随对象)。

You are probably better off with ScalaTest or Specs. The latter definitely supports parameterized tests, and is widely used in the Scala community. JUnit's syntax for parameterized tests is pretty horrible, and its reliance on static declarations won't make your task easier in Scala (probably you need a companion object).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文