首页 文章

JUnit如何设置测试类?

提问于
浏览
2

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

java.lang.Exception: Test class should have exactly one public zero-argument constructor

我应该为此目的使用什么?

现在我使用不同的类来存储模拟,它看起来不太好看

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)
    }
}

2 回答

  • 2

    默认的JUnit 4运行器不提供此类功能:parameterized tests .
    要使用它,您需要使用 Parameterized runner类注释您的类,并定义一个 @Parameterized.Parameters 函数来设置每个场景的参数值 .

    例如 :

    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)
        }
    }
    

    没有经过测试的代码,但您应该明白这一点 .

  • 2

    使用Junit5,您可以在没有额外课程的情况下实现它 .

    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 用于参数化测试 . 有几种方法writing parameterized tests with junit5.需要以下依赖项 .

    <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>
    

相关问题