如何使用 mockito 模拟方法?
Posted
技术标签:
【中文标题】如何使用 mockito 模拟方法?【英文标题】:How to mock methods using mockito? 【发布时间】:2020-12-08 14:10:53 【问题描述】:我有一个抽象类和一个派生类。派生类是一个服务,因此会自动装配到测试类中。我需要模拟和测试抽象类中有一个方法。我当前的实现不起作用,我不确定为什么。
我已经为我想要测试的类创建了一个间谍,并在测试中使用该间谍调用了该方法。但仍然 mockito 无法返回我的模拟值。
abstract class AbstractMyClass
fun hello(): String
"bello"
@Service
class MyClass: AbstractMyClass()
我的测试存根是
@Autowired
private lateinit var myClass: MyClass
@Test
fun `test hello`()
val spy = Mockito.spy(myClass)
Mockito.doReturn("cello").`when`(spy).hello()
val res = spy.hello()
Assert.assertEquals("cello", res)
我在这里做错了什么?
【问题讨论】:
【参考方案1】:在 Kotlin 中,方法默认是最终的。因此,AbstractMyClass::hello()
是最终的,并且由于您从未在 MyClass
中覆盖它,因此它保持不变并且 Mockito 不会存根。
要让上面的代码工作,你需要打开AbstractMyClass
中的方法:
abstract class AbstractMyClass
open fun hello(): String
"bello"
顺便说一句,从您的示例中不清楚您到底要测试什么。我不认为你在这里测试MyClass
的行为......
【讨论】:
这是我实际问题的代表。在我的实际代码中,我需要在AbstractMyClass
中测试一个调用hello
的方法。所以,基本上我需要模拟方法hello
来返回某个值。我尝试在方法中使用open
,但它仍然不起作用。 Mockito 仍然调用该方法。一些非常奇怪的事情实际上发生了。我在测试中的val res = spy.hello()
行和抽象类的hello
方法中放置了一个中断指针。理想情况下,指针应该停在val res = spy.hello()
行,而是停在hello
方法内。
基本上`Mockito.doReturn("cello").when
(spy).hello()`在我的测试中调用hello()
方法而不是嘲笑它..为什么会这样?以上是关于如何使用 mockito 模拟方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中使用 Mockito 模拟结果集并填充它