【问题标题】:JUnit how set up test class?JUnit如何设置测试类?
【发布时间】:2018-12-09 13:36:29
【问题描述】:

我使用测试类的构造函数来模拟对象。但我想为每个测试方法的存根模拟对象设置参数。 我尝试使用测试类的构造函数参数,但 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)
    }
}

【问题讨论】:

    标签: java unit-testing junit kotlin


    【解决方案1】:

    默认的 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-09
        • 2010-12-13
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-29
        相关资源
        最近更新 更多