- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我在通过 ArgumentCaptor 捕获 Class 参数时遇到问题。我的测试类如下所示:
@RunWith(RobolectricGradleTestRunner::class)
@Config(sdk = intArrayOf(21), constants = BuildConfig::class)
class MyViewModelTest {
@Mock
lateinit var activityHandlerMock: IActivityHandler;
@Captor
lateinit var classCaptor: ArgumentCaptor<Class<BaseActivity>>
@Captor
lateinit var booleanCaptor: ArgumentCaptor<Boolean>
private var objectUnderTest: MyViewModel? = null
@Before
fun setUp() {
initMocks(this)
...
objectUnderTest = MyViewModel(...)
}
@Test
fun thatNavigatesToAddListScreenOnAddClicked(){
//given
//when
objectUnderTest?.addNewList()
//then
verify(activityHandlerMock).navigateTo(classCaptor.capture(), booleanCaptor.capture())
var clazz = classCaptor.value
assertNotNull(clazz);
assertFalse(booleanCaptor.value);
}
}
当我运行测试时,抛出以下异常:
java.lang.IllegalStateException: classCaptor.capture() 不能为空
是否可以在 kotlin 中使用参数捕获器?
=========更新 1:
Kotlin:1.0.0-beta-4584
模拟:1.10.19
机器人电动:3.0
=========更新 2:
堆栈跟踪:
java.lang.IllegalStateException: classCaptor.capture() must not be null
at com.example.view.model.ShoplistsViewModelTest.thatNavigatesToAddListScreenOnAddClicked(ShoplistsViewModelTest.kt:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:251)
at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:188)
at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:152)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
最佳答案
从此blog
“让匹配器与 Kotlin 一起工作可能是一个问题。如果你有一个用 kotlin 编写的方法,它不接受可为空的参数,那么我们无法使用 Mockito.any() 来匹配它。这是因为它可以返回 void并且这不能分配给不可为空的参数。如果要匹配的方法是用 Java 编写的,那么我认为它将起作用,因为所有 Java 对象都可以隐式地为空。"
需要一个将 ArgumentCaptor.capture()
作为可空类型返回的包装函数。
将以下内容作为辅助方法添加到您的测试中
fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture()
请看,MockitoKotlinHelpers.kt由 Google 在 Android Architecture 存储库中提供以供引用。 capture
函数提供了一种方便的方式来调用 ArgumentCaptor.capture()
。打电话
verify(activityHandlerMock).navigateTo(capture(classCaptor), capture(booleanCaptor))
更新:如果上述解决方案不适合您,请在下方评论中查看 Roberto Leinardi 的解决方案。
关于android - kotlin 和 ArgumentCaptor - IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34773958/
我需要验证 ArgumentCaptor 没有捕获任何东西。有没有办法验证这一点? Mockito.verify( /* captor has not captured anything */ ) 最
accountHandler 类中有一个具有以下签名的方法 public void processMessage(String accountId, Metrics metrics, Optional
在测试中,我使用了模拟服务。我想检查是否使用其中一个参数的特定属性调用了一次服务。然而,该方法也被其他参数多次调用,但我只对上面的一次调用感兴趣。 我的目的是使用参数捕获器验证调用,以检查感兴趣的调用
我有一个我 mock 过的对象。该对象具有以下方法: > List execute(List list) 这个方法有两个调用: execute(List); execute(List); 类(clas
我正在尝试使用 Mockito 和 JUnit 来测试多线程应用程序。以下是一些有问题的代码: ArgumentCaptor messageCaptor = ArgumentCaptor.forCla
我尝试使用参数捕获来确定哪些参数被传递给模拟的 Mockito 方法,但我无法捕获任何值。 class CombinedEvent { final List events; public
我正在开发一个 Android 应用程序,使用 AndroidStudio,我希望有人能告诉我为什么我不能让 Mockito 使用 argumentCaptor.capture() 或 anyObje
我正在尝试使用 Mockito 来捕获“int”类型的参数。 这是我正在测试的代码: public class Client { private final Board board; priv
我必须测试一个使用可变对象的方法 private final List buffer; ... flushBuffer() { sender.send(buffer); buffer.clea
当我使用超过 1 个 ArgumentCaptor 参数时,我收到一个空指针。可能有人知道出了什么问题吗? @RunWith(PowerMockRunner.class) @PrepareForTes
ArgumentCaptor 无法记录时遇到问题多次调用同一个方法时的参数。基本上这似乎不起作用: List mList = mock(List.class); Dummy dummy = new D
考虑一个将接口(interface)实现作为参数的函数,如下所示: interface Callback { fun done() } class SomeClass {
我想验证一个助手类所做的日志记录,该类调用带有一些可变参数的方法。 我正在使用 Mockito (1.10.19) 来模拟实际的记录器,并验证模拟的方法是否按预期调用。 我使用 ArgumentCap
我已经绝望了,我不明白为什么这个测试没有被评估为成功。我已经检查过一百万次了: package someptest; import static org.hamcrest.MatcherAssert.
我有 Somefun(){ mockedService.execute(()->{ //function body }) } 所以我想在模拟中运行execute方法。我怎样才能
我正在测试使用 Architecture Components 中的 Room 库生成的 DAO 类。我想检查连接多个表的查询返回的 LiveData 是否会在数据更改时更新。 我一开始使用 InOr
我有一些通用接口(interface)可以模拟: public interface RequestHandler { public Object handle(Object o); } 并且这个模
问题是我有两个 argumentCaptors,我需要使用 Mockito.when().then() 两次,这个 argumentCaptors.capture() 在when() 中方法的参数。但
Mockito ArgumentCaptor 似乎颠覆了泛型,如以下伪代码所示。 public Class SomeClass{ public void someMethod(Object ms
要检查与方法调用中的参数属于某种类型的模拟的交互次数,可以这样做 mock.someMethod(new FirstClass()); mock.someMethod(new OtherClass()
我是一名优秀的程序员,十分优秀!