【问题标题】:How to mock methods using mockito?如何使用 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)
}

我在这里做错了什么?

【问题讨论】:

    标签: spring-boot unit-testing kotlin mockito


    【解决方案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()方法而不是嘲笑它..为什么会这样?
    猜你喜欢
    • 2020-03-20
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多