gpt4 book ai didi

java - 如何使用 Mockito 验证测试期间调用了 SUT 的另一个公共(public)方法

转载 作者:行者123 更新时间:2023-12-01 16:44:54 25 4
gpt4 key购买 nike

我知道有重复的内容,但那里没有给出有关实际问题的答案。

How to verify if method is called on System under test (not a mock)

我有一个类:

class A {

public long a() {
if(something) {
return quicklyCalculatedResult
} else {
return b() run on separate thread, with this one blocked
}
}

public long b() {} //doStuffOnCurrentThread;

}

我对 b() 有一套完整的测试,它完成了繁重的工作。不幸的是,我必须做出像 a() (遗留代码)这样​​的丑陋想法,并且我不想复制所有测试。方法 b() 的。此外,这两者都需要公开。

我想验证在某些情况下 a() 调用 b(),但我不能这样做,因为测试的类不是模拟。我需要一种方法来验证该方法是在真实对象上调用的,而不仅仅是模拟对象。

最佳答案

Mockito 和其他 kotlin 模拟库提供部分模拟或类似功能。您可以指定要调用的真实方法,而其他方法仍保留为 stub :

Mockito java 示例:

A classUnderTest = mock(A.class);
when(classUnderTest.a()).thenCallRealMethod();

classUnderTest.a();
verify(classUnderTest).b()

查看mockito Documentation关于部分 mock 。不鼓励部分模拟,因为它不适合良好的 OOP 设计,但在您的情况下,它符合其预期目的,即测试困难的遗留代码。

使用普通 Mockito 的 Kotlin 示例:

val classUnderTest = mock(A::class.java)
`when`(classUnderTest.a()).thenCallRealMethod()

classUnderTest.a()
verify(classUnderTest).b()

mockito-kotlin提供的扩展允许您以更符合 kotlin 习惯的方式使用mockito。不幸的是,似乎没有一种方法可以以 kotlin 惯用的方式进行部分模拟,但可以在mockito-kotlin 中实现,如下所示:

val classUnderTest = mock<A>()
doCallRealMethod().whenever(classUnderTest).a()

classUnderTest.a()
verify(classUnderTest).b()

MockK是一个惯用的 kotlin 模拟库,允许通过 spy 实现此功能。创建类的spy后,您可以选择 stub 方法:

val classUnderTest = spyk<A>()
every { classUnderTest.b() } returns 1L

classUnderTest.a()
verify { classUnderTest.b() }

关于java - 如何使用 Mockito 验证测试期间调用了 SUT 的另一个公共(public)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53722837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com