我想使用doReturn(sth).when(underTest).someFunc()
而不是when(underTest.someFunc()).thenReturn(sth)
。
(不想实际在someFunc()
-https://stackoverflow.com/a/29394497/541624内部执行任何操作)
在Java中,我可以underTest = Mockito.spy(new SomeClass(someParam));
我得到:
Mockito cannot mock/spy because :
- final class
答案 0 :(得分:0)
您不能模拟/监视Kotlin类的原因是它们是最终的(默认情况下)。因此,除非您输入关键字open
,否则Mockito无法模拟此类。
Mockito版本2引入了一项功能,允许您模拟/监视最终类。
该怎么做?
将mockito-inline
依赖项与其他mockito v2依赖项一起添加。例如:testImplementation 'org.mockito:mockito-inline:2.8.9'
然后照常使用模拟方法。
这是一个虚拟测试,它演示了如何模拟方法而不执行任何操作。
class Foo {
var xval = 0
fun foo(x: Int, y: Int): Int = x / y
fun bar(x: Int) {
xval = x
}
}
class FooTest {
@Test
fun fooTest() {
val foo = Mockito.mock(Foo::class.java)
Mockito.doAnswer(Answers.RETURNS_DEFAULTS).`when`(foo).foo(10, 2)
assertEquals(0, foo.foo(10, 2))
Mockito.doNothing().`when`(foo).bar(100)
assertEquals(0, foo.xval)
}
}
如您所见,您可以为返回某些内容的方法返回默认值,或者为void方法不执行任何操作。
否则,您可以使用没有此问题的mockk
https://mockk.io/库。
如上所述,我建议您考虑是否可以在此处使用接口/抽象类而不是具体类。这是使用模拟抽象您的依赖关系的最佳方法。