首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JUnit如何设置测试类?

JUnit如何设置测试类?
EN

Stack Overflow用户
提问于 2018-12-09 13:36:29
回答 2查看 694关注 0票数 2

我使用测试类的构造函数来模拟对象。但是,我想从每个测试方法中为模拟对象的存根设置参数。我尝试使用test类的构造函数参数,但是JUnit限制了这一点:

代码语言:javascript
复制
java.lang.Exception: Test class should have exactly one public zero-argument constructor

为了这个目的我该用什么?

现在我使用不同的类来模拟商店,它看起来不太好。

代码语言:javascript
复制
package testci

import org.junit.Test
import org.mockito.Mockito.*

interface Object {
    fun get(p: Int): Int
}

class setUpMock(val param: Int, val param2: Int) {
    val mock = mock(Object::class.java)!!
    init {
        `when`(mock.get(param)).thenReturn(param2)
    }
}

class HelloTest {
    @Test
    fun `first test`() {
        val sMock = setUpMock(1,2)
        println(sMock.mock.get(1))
    }

    @Test
    fun `second test`() {
        val sMock = setUpMock(1,3)
        println(sMock.mock.get(1))
        verify(sMock.mock).get(1)
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-09 13:49:36

默认的JUnit 4运行程序不提供这样的特性:参数化试验

要使用它,需要用Parameterized runner类对类进行注释,并定义一个@Parameterized.Parameters函数来设置每个场景的参数值。

例如:

代码语言:javascript
复制
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized::class)
class HelloTest(val param1: Int, val param2: Int) {

    companion object {
        @JvmStatic
        @Parameterized.Parameters
        fun data() = listOf(
                arrayOf(1, 2),
                arrayOf(1, 3)
        )
    }
    @Test
    fun `first test`() {
        val sMock = setUpMock(param1, param2)
        println(sMock.mock.get(1))
    }

    @Test
    fun `second test`() {
        val sMock = setUpMock(param1, param2)
        println(sMock.mock.get(1))
        verify(sMock.mock).get(1)
    }
}

没有经过测试的代码,但你应该知道这个想法。

票数 3
EN

Stack Overflow用户

发布于 2018-12-09 14:03:52

使用Junit5,您可以在不需要额外类的情况下实现它。

代码语言:javascript
复制
import org.junit.jupiter.api.Test
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.CsvSource
import org.mockito.Mockito.*
import kotlin.test.assertEquals

interface Object {
    fun get(p: Int): Int
}

class HelloTest {

    var mock = mock(Object::class.java)!!

    @Test
    fun `first test`() {
        `when`(mock.get(1)).thenReturn(2)
        assertEquals(2, mock.get(1))
    }

    @Test
    fun `second test`() {
        `when`(mock.get(1)).thenReturn(2)
        println(mock.get(1))
        verify(mock).get(1)
    }

    @CsvSource("1,2","3,4")
    @ParameterizedTest
    fun `csv parameterized test`(key: Int, value: Int){
        `when`(mock.get(key)).thenReturn(value)
        assertEquals(value, mock.get(key))
    }
}

注意参数化测试的@CsvSource。有几种用junit5编写参数化测试。方法需要遵循依赖关系。

代码语言:javascript
复制
<dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-test-junit</artifactId>
    <version>1.3.11</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.3.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.3.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>2.22.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>2.22.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.3.1</version>
    <scope>test</scope>
</dependency>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53692877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档