我使用测试类的构造函数来模拟对象。但是,我想从每个测试方法中为模拟对象的存根设置参数。我尝试使用test类的构造函数参数,但是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)
}
}发布于 2018-12-09 13:49:36
默认的JUnit 4运行程序不提供这样的特性:参数化试验。
要使用它,需要用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)
}
}没有经过测试的代码,但你应该知道这个想法。
发布于 2018-12-09 14:03:52
使用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。有几种用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>https://stackoverflow.com/questions/53692877
复制相似问题