Mockito 对象总是给出 NullPointer 异常
Mockito object always giving a NullPointer exception
这是我要测试的class。
open class Foo(bar :Bar){
fun someMethod() = bar.anotherMethod()
}
而且我有一个生成器 class 来获取 Foo
模拟实例,因为 Mockito 不能模拟构造函数参数。
open class FooBuilder{
fun makeFoo(bar:Bar) = Foo(bar)
}
这是我制作模拟对象并验证的方法。
var fooBuilderMock = mock(FooBuilder::class)
var barMock = mock(Bar::class)
var fooMock = mock(Foo::class)
Mockito.`when`(fooBuilderMock.makeFoo(barMock)).thenReturn(fooMock)
fooMock.someMethod()
Mockito.verify(barMock, Mockito.times(1)).anotherMethod()
我在 barMock
对象上遇到空指针异常。
别用Builder,没必要。此外,不要模拟您要测试的 class。如果你这样做,你的测试就没有意义。
class FooTest {
private val barMock = mock(Bar::class)
private lateinit var foo: Foo
@BeforeEach
fun setUp() {
MockitoAnnotations.initMocks(this)
foo = Foo(barMock)
}
@Test
fun `Your test name`() {
// Arrange
Mockito.`when`(barMock.anotherMethod()).thenReturn(// whatever it should return)
// Act
fooMock.someMethod()
// Assert
Mockito.verify(barMock, Mockito.times(1)).anotherMethod()
}
}
作为旁注,请考虑查看 mockk 并使用它代替 Mockito。它是在 kotlin 中实现的,因此从第一天起就支持它。有了它,您的测试看起来很相似,但更多地遵循 kotlin“风格”:
class FooTest {
@MockK
private lateinit var barMock = mock(Bar::class)
private lateinit var foo: Foo
@BeforeEach
fun setUp() {
MockitoAnnotations.initMocks(this)
foo = Foo(barMock)
}
@Test
fun `Your test name`() {
// Arrange
every { barMock.anotherMethod() } returns //whatever it should return
// Act
foo.someMethod()
// Assert
verify(exactly = 1) { barMock.anotherMethod() }
}
}
这是我要测试的class。
open class Foo(bar :Bar){
fun someMethod() = bar.anotherMethod()
}
而且我有一个生成器 class 来获取 Foo
模拟实例,因为 Mockito 不能模拟构造函数参数。
open class FooBuilder{
fun makeFoo(bar:Bar) = Foo(bar)
}
这是我制作模拟对象并验证的方法。
var fooBuilderMock = mock(FooBuilder::class)
var barMock = mock(Bar::class)
var fooMock = mock(Foo::class)
Mockito.`when`(fooBuilderMock.makeFoo(barMock)).thenReturn(fooMock)
fooMock.someMethod()
Mockito.verify(barMock, Mockito.times(1)).anotherMethod()
我在 barMock
对象上遇到空指针异常。
别用Builder,没必要。此外,不要模拟您要测试的 class。如果你这样做,你的测试就没有意义。
class FooTest {
private val barMock = mock(Bar::class)
private lateinit var foo: Foo
@BeforeEach
fun setUp() {
MockitoAnnotations.initMocks(this)
foo = Foo(barMock)
}
@Test
fun `Your test name`() {
// Arrange
Mockito.`when`(barMock.anotherMethod()).thenReturn(// whatever it should return)
// Act
fooMock.someMethod()
// Assert
Mockito.verify(barMock, Mockito.times(1)).anotherMethod()
}
}
作为旁注,请考虑查看 mockk 并使用它代替 Mockito。它是在 kotlin 中实现的,因此从第一天起就支持它。有了它,您的测试看起来很相似,但更多地遵循 kotlin“风格”:
class FooTest {
@MockK
private lateinit var barMock = mock(Bar::class)
private lateinit var foo: Foo
@BeforeEach
fun setUp() {
MockitoAnnotations.initMocks(this)
foo = Foo(barMock)
}
@Test
fun `Your test name`() {
// Arrange
every { barMock.anotherMethod() } returns //whatever it should return
// Act
foo.someMethod()
// Assert
verify(exactly = 1) { barMock.anotherMethod() }
}
}