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