如何使用 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 模拟方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Mockito正确模拟每个循环?

如何使用 Mockito 框架模拟我的服务

如何在 Java 中使用 Mockito 模拟结果集并填充它

如何使用 mockito/powermock 模拟 Google 的地理编码 API 请求?

如何在 Mockito 中模拟全局变量

如何使用 Mockito 对 void 方法的行为进行编程? [复制]