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

JUnit 5参数化测试-使用Kotlin在@MethodSource中“无法调用非静态方法”

邓光耀
2023-03-14

将标准JUnit5测试转换为参数化测试,以便使用Kotlin中的@ParamterizedTest@MethodSource注释遍历测试用例流。

@methodsource无法访问数据流。这似乎是这个注释的一个问题,因为@valueSource(strings=[“sf”,“nyc”])按照预期遍历静态定义的选项。

错误:

PreConditionViolationException:无法对空目标调用非静态方法{someMethodName}。

参数化测试设置为通过数据类流,类似于Phillip Hauer在参数化测试的数据类中概述的设置。

dependencies {
    ...    
    classpath("de.mannodermaus.gradle.plugins:android-junit5:$junit5_version")
}
apply plugin: "de.mannodermaus.android-junit5"
android {
    ...
    compileOptions.targetCompatibility = JavaVersion.VERSION_1_8
    kotlinOptions.jvmTarget = "1.8"
}
dependencies {
    testImplementation "org.junit.jupiter:junit-jupiter-api:5.6.2"
    testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.6.2"
    testImplementation "org.junit.jupiter:junit-jupiter-params:5.6.2"
}
class SomeTest {
    private val testDispatcher = TestCoroutineDispatcher()

    private fun someDataStates() = Stream.of(
        // Kotlin data class
        TestState("123"),
        TestState("345")
    )

    @ParameterizedTest
    @MethodSource("someDataStates")
    fun someTest(testState: TestState) = testDispatcher.runBlockingTest {
        // Test state here.
        ...
    }
}
  • Android Studio 4.0
  • 建筑#AI-193.6911.18.40.6514223,2020年5月20日建成
  • 运行时版本:1.8.0_242-release-1644-b3-6222593 x86_64
  • VM:OpenJDK 64位服务器VM,JetBrains S.r.o
  • MacOS 10.15.5
  • gc:ParNew,ConcurrentMarkSweep
  • 内存:1979M
  • 内核:16
  • 注册表:ide.new.welcome.screen.force=true
  • 非捆绑插件:cn.wjdghd.unique.plugin.id,com.android.tool.sizereduction.plugin,com.developerphil.adbidea,com.thoughtworks.gauge,mobi.hsz.idea.gitignore

testCases.kt

fun someDataStates() = Stream.of(
    TestState("123"),
    TestState("345")
)

Sometest.kt

private fun SomeDataStates() = someDataStates()

@ParameterizedTest
@MethodSource("SomeDataStates")
fun someTest(testState: TestState) = testDispatcher.runBlockingTest {
   // Test state here.
   ...

}
fun someDataStates() = listOf(
    TestState("123"),
    TestState("345")
)

org.junit.platform.commons.PreconditionViolationException:无法对空目标调用非静态方法[private final{someMethodName}。

进程已完成,退出代码为255

共有1个答案

翟凯
2023-03-14

我想您错过了告诉JUnit实例化一次测试类的信息,如下所示:

import org.junit.jupiter.api.TestInstance
import org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS

@TestInstance(PER_CLASS) // <--- This one will do the trick
class SomeTest {

    private val testDispatcher = TestCoroutineDispatcher()

    @ParameterizedTest
    @MethodSource("someDataStates")
    fun someTest(testState: TestState) = testDispatcher.runBlockingTest {
        // Test state here.
        ...
    }

    private fun someDataStates() = listOf(
        TestState("123"),
        TestState("345")
    )
}
 类似资料:
  • 我有一个类,它是有向无环图上拓扑排序的实现。此类中有两种方法: > 公共静态int[]排序(int[][]dag)-将表示DAG的二维数组作为参数,并返回有序节点的数组 私有静态无效访问-该访问执行深度优先搜索,并用于排序方法 我必须编写一个JUnit测试来测试具有不同输入的代码。我对JUnit测试比较陌生,不知道如何解决这个问题。我想我需要编写一个参数化测试,但是如何测试静态方法sort(int

  • 问题内容: 我正在尝试使用此功能,但正在收到消息。 我可以简单地使其静态化,从而解决了我的问题,但是如果不走那条路线怎么办。我想保持方法非静态。 以下是一些代码,可让您了解发生了什么: 问题答案: 创建您的课程的实例 这是一个实例方法,它需要一个实例来访问它。请阅读有关类和对象的官方教程。

  • 我正在为我的项目编写junit测试用例,但我在这里面临一个问题,就是我在我的一个java类(GraphNodes.java)中使用的方法 这是我的Junit测试类 我的junit失败了,它说excepted<3>但actual<0>而且我不能将静态方法仅改为public,因为这会影响代码的某些功能,而且由于我是junit的新手,所以我不知道如何解决这一问题。所以有人能在这里帮助我吗?谢谢!!

  • 问题内容: 尝试在静态类中调用非静态方法时遇到错误。 无法从类型播放中静态引用非静态方法methodName() 我不能使该方法静态,因为这也给我一个错误。 此静态方法无法从xInterface隐藏实例方法 有什么办法可以在另一个静态方法中轮回调用非静态方法?(这两种方法位于单独的包和单独的类中)。 问题答案: 从静态方法中调用非静态方法的唯一方法是使类的实例包含非静态方法。根据定义,非静态方法是

  • 我正在努力得到一个用户的基础上,他的id或电子邮件后,他登录通过一个表单。这个函数是在user.class.php中定义的,我想在另一个名为profile.php的php文件中调用它,但它仍然给我带来语法错误,我不知道如何修复它。 错误:不推荐使用:不应静态调用非静态方法User::GetUserId()注意:未定义变量:email in 使用getters和setters,函数 下面是profi

  • 问题内容: 到目前为止,我有以下代码: } 当我尝试在末尾设置double 时,出现错误消息“无法对非静态方法进行静态引用”。它说解决方法是也使该方法静态化,但是我的教授告诉我不要将该字段静态化。有一个简单的解决方案我只是想念吗? 问题答案: 静态方法属于该类,非静态方法属于该类的 实例 。 当您从呼叫时,您会收到错误消息,因为它与任何实例都没有关联。 您需要创建该类的实例: 然后,您可以调用实例