【发布时间】:2021-09-13 03:52:26
【问题描述】:
我有一个客户端类(在 Android 应用程序中用 Kotlin 编写),它实现了一个接口 ReadyCallback(在应用程序的库中用 Java 编写,应用程序依赖于这个库)。在客户端中,我有一个createClient() 方法,它将创建一个带有ReadyCallback 参数的客户端。如果准备好了,我会通过调用classC.otherMethod()来执行其他任务,如果没有准备好,我只是创建客户端而不做其他事情:
在图书馆里:
// Somewhere in this library, I have logic to call `readyCallback.onReady()` when I consider it's "ready"
interface ReadyCallback {
void onReady()
}
class Manager {
private final ReadyCallback readyCallback;
public void onConnected(final boolean isConnected) {
if (isConnected) {
readyCallback.onReady();
}
}
}
在应用中:
class ClassA internal constructor(private val clientProvider: ClassB, private val classC: ClassC, private val classD: ClassD) : ReadyCallback {
fun createClient() {
val client = clientProvider.create(getReadyCallback())
}
private fun getReadyCallback() {
return ReadyCallback { onReady() }
}
override fun onReady() {
logInfo { "It's ready! Now do some stuff by calling classC.otherMethod()" }
classC.otherMethod()
}
}
在单元测试中,我想验证当我创建客户端并且它准备好时,classC 的 otherMethod() 将被调用。我尝试执行以下操作,但不正确:
import com.nhaarman.mockitokotlin2.*
import org.junit.*
class ClassATest {
lateinit var unitUnderTest: ClassA
lateinit var clientProviderMock: ClassB
lateinit var classCMock: ClassC
lateinit var clientMock: ClassD
@Before
override fun setup() {
super.setup()
clientProviderMock = mock()
classCMock = mock()
clientMock = mock()
unitUnderTest = ClassA(clientProvider = clientProviderMock, classC = classCMock, classD = classDMock)
whenever(clientProviderMock.create(any()).thenReturn(client)
}
@Test
fun `when create client then call otherMethod`() {
unitUnderTest.createClient()
verify(classCMock).otherMethod()
}
}
错误信息显示:
Wanted but not invoked:
classC.otherMethod();
Actually, there were zero interactions with this mock.
我认为我得到这个错误的原因是,如果我不调用getReadyCallback(),这意味着我没有调用回调,所以没有调用classC.otherMethod()。但除此之外,我真的坚持这一点,我不知道如何对我的期望行为进行单元测试(如果准备好,将调用 classC.otherMethod(),如果未准备好,则不会调用此方法)。
我知道我不能执行以下操作,因为 unitUnderTest 不是模拟对象:
callbackMock = mock()
whenever(unitUnderTest.getReadyCallback()).thenReturn(callbackMock)
whenever(clientProviderMock.create(callbackMock).thenReturn(client)
谁能帮帮我?
【问题讨论】:
-
您好。您能否更新您的问题以包含日志输出以及 Gradle/Maven 文件中的相关依赖项(Kotlin、Mockito、Junit 等),包括版本。检查版本是否对齐很重要。您提供的代码也有错误(缺少括号,
void onReady()不是 Kotlin,缺少 B/C/D 类)所以很难检查 - 您可以更新它以确保它是 reproducible?跨度> -
在测试设置中你存根
clientProvider.create(...),所以在ClassA.createClient()它永远不会调用getReadyCallback()——取而代之的是Mockito拦截clientProvider.create(...)并立即返回模拟客户端。 -
对不起,我没有说清楚。是的,它是 Java 而不是 Kotlin,它来自 classA 的包所依赖的另一个包。我试图编辑问题。
标签: java unit-testing kotlin callback mockito-kotlin