问题标签 [mockk]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4175 浏览

kotlin - 如何捕获传递给模拟函数的参数并返回它?

因此,在我正在测试的服务中,我有一个依赖服务,它正在获取一个对象并对其进行一些扩充。我想模拟依赖服务正在做的部分,并使模拟返回它收到的内容。问题是我无权访问它。

我试过这样的事情:

但它失败了:kotlin.UninitializedPropertyAccessException: lateinit property captured has not been initialized

0 投票
0 回答
1070 浏览

gradle - gradle(compileTestKotlin) 关于 io.mockk.every 失败

我是关于 Kotlin 的新手,Gradle。我试图对休息 api(控制器)测试进行 TDD。

我看到了帮助 kotlin tdd 初学者的https://spring.io/guides/tutorials/spring-boot-kotlin/

但是,有些不对劲。

错误信息

我的测试代码是:

我的毕业代码是:

我正在使用 intellij IDE,没有代码问题(红色错误消息)

为什么会这样??

我只是跟进https://spring.io/guides/tutorials/spring-boot-kotlin/

0 投票
2 回答
1740 浏览

android - 如何使用 Mockk 使用Transaction 方法模拟 android 房间

我正在尝试为我的业务逻辑进行一些单元测试。我有存储库,我将响应中的一些数据保存到房间数据库(2.1.0-rc01)。在单个事务中将数据保存到具有不同 dao 的不同表中。代码简化:

项目存储库

对于单元测试,我使用的是 Mockk 库。如何使用Transaction 方法模拟房间?withTransaction 被声明为

我正在尝试编写测试

0 投票
1 回答
1450 浏览

kotlin - 如何在轻松模式下模拟对象?

我有一个对象

我希望它在我的测试中成为一个存根(mock 术语中的轻松模拟)。

换句话说,我希望这个测试毫无例外地通过:

0 投票
0 回答
221 浏览

android - 如何对仅调用不返回任何依赖项的函数的函数进行单元测试?

我在如何对我的视图模型功能进行单元测试时遇到问题。

现在,如果dependency.callFunction()要返回一些东西,我可以很容易地测试我是否得到了值并做一个断言,liveData.value shouldBe valueFromFunction但在这种情况下,函数只是执行一些东西

我考虑过使用验证来测试它

但是如果我走这条路,这已经在测试实现细节了。我应该测试行为所以我决定测试状态

由于这是一个协程,因此执行将停止dependency.callFunction(),只有在成功时才会恢复并发出状态。现在这测试了行为,但是,如果开发人员删除了依赖调用怎么办?现在测试仍然可以通过而不调用依赖项。

我应该继续测试实现并验证依赖调用吗?还是我应该跳过这个测试?

非常感谢!

0 投票
1 回答
459 浏览

unit-testing - mockk kotlin rest api 回调

我在这里读过。这与我的问题很接近,我需要更多关于这部分的指导。

鉴于,

}

我想模拟 Service.getProductInfo 并执行快乐路径和不快乐路径处理,我该如何使用 mockk 呢?

附加问题,有没有办法在 jacoco 中排除某些功能,如 start 以上?有时某些函数对单元测试没有太大意义,在 jacoco 中排除它更有意义。

更新:

我从 Gradle 网站了解到,它目前不支持方法排除。

回调接口如下

我正在使用改造服务。

0 投票
1 回答
741 浏览

inline - mockk 是否支持内联挂起?

当我尝试模拟挂起内联函数时,coEvery 似乎挂起。

如果删除内联修饰符,则下面的代码有效

storeApi 中的函数: suspend inline fun getAllStores(): List<Store>

测试代码: coEvery { storeApi.getAllStores() } returns allStores

我想有一种方法来模拟挂起内联函数,而不仅仅是挂起

0 投票
1 回答
367 浏览

kotlin - 随机测试崩溃 TDD Kotlin

下面的测试会导致随机崩溃。我大部分时间都不知所措,它工作正常。

附带的代码很有趣 login(credentials: LoginCredentials) { _loginLiveData.value = LoginResult.Loading(true)

崩溃是:

java.lang.AssertionError:验证失败:发生的调用少于订单验证序列要求的调用。

匹配器:Observer(#94).onChanged(eq(Loading(value=true)))) Observer(#94).onChanged(eq(Success(user=Current User Response: 1: testUserName1)))) Observer(#94 ).onChanged(eq(Loading(value=false))))

调用:1) Observer(#94).onChanged(Loading(value=true)) 2) Observer(#94).onChanged(Success(user=Current User Response: 1: testUserName1))

堆栈跟踪: 1)
io.mockk.impl.InternalPlatform.captureStackTrace
(InternalPlatform.kt:114)
io.mockk.impl.stub.MockKStub.handleInvocation
(MockKStub.kt:256)
io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler $1.invocation (JvmMockFactoryHelper.kt:25)
io.mockk.proxy.jvm.advice.Interceptor.call
(Interceptor.kt:20)
io.mockk.proxy.jvm.advice.BaseAdvice.handle
(BaseAdvice.kt:42)
io.mockk.proxy.jvm.advice.jvm.JvmMockKProxyInterceptor.interceptNoSuper (JvmMockKProxyInterceptor.java:45)
androidx.lifecycle.Observer$Subclass18.onChanged
(-:-1)
androidx.lifecycle.LiveData.considerNotify
(LiveData.java:131 )
androidx.lifecycle.LiveData.dispatchingValue
(LiveData.java:149)
androidx.lifecycle.LiveData.setValue
(LiveData.java:307)
androidx.lifecycle.MutableLiveData.setValue
(MutableLiveData.java:50)
com.test.testapp.ui.login.LoginViewModel.login
(LoginViewModel.kt:84)
com.test.testapp.featureTests.login.LoginFeatureShould$perform login without a之前保存的用户$1.invokeSuspend
(LoginFeatureShould.kt:102)
kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith
(ContinuationImpl.kt:32)
kotlinx.coroutines.DispatchedTask.run
(Dispatched.kt:233)
kotlinx.coroutines.EventLoopImplBase.processNextEvent
(EventLoop.kt:116)
kotlinx.coroutines.BlockingCoroutine.joinBlocking
(Builders.kt:76)
kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking
(Builders.kt:53)
kotlinx.coroutines.BuildersKt.runBlocking
( -:1)
kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default
(Builders.kt:35)
kotlinx.coroutines.BuildersKt.runBlocking$default
(-:1)
com.test.testapp.featureTests.login.LoginFeatureShould.perform login 没有以前保存的用户 (LoginFeatureShould.kt:89)

(NativeMethodAccessorImpl.java:-2)N
sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke
(Method.java :498)
org.junit.platform.commons.util.ReflectionUtils.invokeMethod
(ReflectionUtils.java:628)
org.junit.jupiter.engine.execution.ExecutableInvoker.invoke
(ExecutableInvoker.java:117)
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7 (TestMethodTestDescriptor.java:184)
org.junit.platform.engine .support.hierarchical.ThrowableCollector.execute (ThrowableCollector.java:73)
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod (TestMethodTestDescriptor.java:180)
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute
(TestMethodTestDescriptor.java:127)
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute
(TestMethodTestDescriptor.java:68)
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5 (NodeTestTask.java: 135)
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute (ThrowableCollector.java:73)
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7 (NodeTestTask.java:125)
org.junit.platform.engine.support.hierarchical.Node.around
(Node.java:135)
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8 (NodeTestTask.java:123)
org.junit .platform.engine.support.hierarchical.ThrowableCollector.execute (ThrowableCollector.java:73)
org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively (NodeTestTask.java:122)
org.junit.platform.engine.support .hierarchical.NodeTestTask.execute
(NodeTestTask.java:80)
java.util.ArrayList.forEach
(ArrayList.java:1251)
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll (SameThreadHierarchicalTestExecutorService.java:38) org.junit.platform.engine.support.hierarchical.NodeTestTask。 lambda$executeRecursively$5 (NodeTestTask.java:139)
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute (ThrowableCollector.java:73)
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7 (NodeTestTask.java:125)
org.junit.platform.engine.support.hierarchical.Node.around
(Node.java:135)
org.junit .platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8 (NodeTestTask.java:123)
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute (ThrowableCollector.java:73)
org.junit.platform。 engine.support.hierarchical.NodeTestTask.executeRecursively (NodeTestTask.java:122)
org.junit.platform.engine.support.hierarchical.NodeTestTask.execute
(NodeTestTask.java:80)
java.util.ArrayList.forEach
(ArrayList.java:1251)
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService。 invokeAll (SameThreadHierarchicalTestExecutorService.java:38) org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5 (NodeTestTask.java:139)
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute (ThrowableCollector .java:73)
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7 (NodeTestTask.java:125)
org.junit.platform.engine.support.hierarchical.Node.around
(Node.java:135)
org.junit .platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8 (NodeTestTask.java:123)
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute (ThrowableCollector.java:73)
org.junit.platform。 engine.support.hierarchical.NodeTestTask.executeRecursively (NodeTestTask.java:122)
org.junit.platform.engine.support.hierarchical.NodeTestTask.execute
(NodeTestTask.java:80)
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit (SameThreadHierarchicalTestExecutorService.java:32) org.junit.platform。 engine.support.hierarchical.HierarchicalTestExecutor.execute (HierarchicalTestExecutor.java:57)
org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute (HierarchicalTestEngine.java:51)
org.junit.platform.launcher.core.DefaultLauncher。执行
(DefaultLauncher.java:229)
org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6
(DefaultLauncher.java:197)
org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams (DefaultLauncher.java:211)
org.junit.platform.launcher .core.DefaultLauncher.execute
(DefaultLauncher.java:191)
org.junit.platform.launcher.core.DefaultLauncher.execute
(DefaultLauncher.java:128)
com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs
(JUnit5IdeaTestRunner.java:74)
com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs (IdeaTestRunner.java:47)
com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart
(JUnitStarter.java:242)
com .intellij.rt.execution.junit.JUnitStarter.main
(JUnitStarter.java:70)

2)
io.mockk.impl.InternalPlatform.captureStackTrace
(InternalPlatform.kt:114)
io.mockk.impl.stub.MockKStub.handleInvocation
(MockKStub.kt:256)
io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation (JvmMockFactoryHelper.kt:25)
io.mockk.proxy.jvm.advice.Interceptor.call (Interceptor.kt:20)
io.mockk.proxy.jvm.advice.BaseAdvice.handle
(BaseAdvice.kt:42)
io.mockk .proxy.jvm.advice.jvm.JvmMockKProxyInterceptor.interceptNoSuper (JvmMockKProxyInterceptor.java:45) androidx.lifecycle.Observer$Subclass18.onChanged
(-:-1)
androidx.lifecycle.LiveData.considerNotify
(LiveData.java:131)
androidx.lifecycle.LiveData.dispatchingValue
(LiveData.java:149)
androidx.lifecycle.LiveData.setValue
(LiveData.java:307)
androidx.lifecycle.MutableLiveData.setValue
( MutableLiveData.java:50)
com.test.testapp.ui.login.LoginViewModel$triggerLogin$1$1.invokeSuspend (LoginViewModel.kt:99)
com.test.testapp.ui.login.LoginViewModel$triggerLogin$1$1.invoke
(LoginViewModel.吨:-1)
kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn (Undispatched.kt:91)
kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext
(Builders.common.kt:146)
kotlinx.coroutines.BuildersKt.withContext (-:1)

(LoginViewModel.kt:98)
kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith
(ContinuationImpl.kt:32)
kotlinx.coroutines.DispatchedTask.run (Dispatched.kt:233)
kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely
(CoroutineScheduler .kt:594)
kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely
(CoroutineScheduler.kt:60)
kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run (CoroutineScheduler.kt:742)

在 io.mockk.impl.recording.states.VerifyingState.failIfNotPassed(VerifyingState.kt:66) 在 io.mockk.impl.recording.states.VerifyingState.recordingDone(VerifyingState.kt:42) 在 io.mockk.impl.recording .CommonCallRecorder.done(CommonCallRecorder.kt:48) at io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:60) at io.mockk.impl.eval.VerifyBlockEvaluator.verify(VerifyBlockEvaluator.kt:27) at io.mockk.MockKDsl.internalCoVerify(API.kt:143) at io.mockk.MockKDsl.internalCoVerify$default(API.kt:134) at io.mockk.MockKDsl.internalCoVerifyOrder(API.kt:212) at io.mockk .MockKKt.coVerifyOrder(MockK.kt:264) at io.mockk.MockKKt.coVerifyOrder$default(MockK.kt:261) at com.test.testapp.featureTests.login.LoginFeatureShould$perform login without a previously saved user$1。invokeSuspend(LoginFeatureShould.kt:104) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:32) at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233) at kotlinx.coroutines.EventLoopImplBase.processNextEvent (EventLoop.kt:116) at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:76) at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:53) at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source) at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:35) at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source) at com.test.testapp.featureTests.login.LoginFeatureShould.perform login without a以前保存的用户(LoginFeatureShould.kt:89) 在 sun.reflect.NativeMethodAccessorImpl。在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java: 43) 的 invoke0(Native Method) 498)在 org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:117)在 org.junit.jupiter .engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:184) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.jupiter.engine。 org.junit.jupiter.engine 中的描述符.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:180)。descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:127) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$ executeRecursively$5(NodeTestTask.java:135) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively $7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8 (NodeTestTask.java:123) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) 在 java .util.ArrayList.forEach(ArrayList.java:1251) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask .lambda$executeRecursively$5(NodeTestTask.java:139) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask。 lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73 ) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) 在 java 的 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)。 org.junit.platform.engine.support.hierarchical.NodeTestTask 的 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) 的 util.ArrayList.forEach(ArrayList.java:1251)。 org.junit.platform.engine.support.hierarchical.ThrowableCollector 上的 lambda$executeRecursively$5(NodeTestTask.java:139)。在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) 在 org.junit.platform.engine.support.hierarchical.Node.around 执行(ThrowableCollector.java:73) (Node.java:135) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute( ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java: 80) 在 org.junit 的 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)。platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) 在 org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) 在 org.junit.platform.launcher。 core.DefaultLauncher.execute(DefaultLauncher.java:229) at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197) at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams (DefaultLauncher.java:211) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128) 在com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:74) 在 com.intellij.rt.execution.junit。IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) 在 com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) 在 com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.爪哇:70)

0 投票
0 回答
170 浏览

android - Mockk - 针对正则表达式测试密码时出现 MockKException

我刚刚开始使用 Mockk 在 Kotlin 中进行单元测试。我正在尝试测试以下功能:

我的测试如下所示:

但我得到:

在线:

我尝试使用 Mockk Matcherany()代替,matches(regEx.toRegex())但没有任何改变。

我不确定我是否在这里使用了正确的工具来完成这项工作。欢迎任何建议。

0 投票
1 回答
2758 浏览

unit-testing - MockK的spyk如何覆盖构造函数?

我目前尝试将一个类测试为通常在构造函数中初始化数据库连接的间谍对象。该类的简化版本如下所示。

现在我尝试以以下方式(简化)测试我的 classToTest 的方法。

现在的问题是我的测试无法开始,因为我不知道如何覆盖可能使用连接模拟而不是初始化连接对象的 init 函数。感谢帮助。