当前位置: 首页 > 知识库问答 >
问题:

如何模拟Kafka记录元数据

澹台文博
2023-03-14

尝试使用Mockito为下面的代码编写单元测试,但我遇到了错误使用方法的异常。结果不为空,已验证,也进入循环。

if(Result!=null) {
   result.getRecordMetadata().topic()
}

这是我所写的:

@Mock
private SendResult<String, data> sendResultData;

RecordMetadata recordMetadata = new RecordMetadata(new TopicPartition("topic", 0), 0, 0, 1234567890L, 1234567890L, 1024, 1024);

SendResult<String, Data> result = new SendResult<String, Data>(producerRecord, recordMetadata);

when(recordMetadata.topic()).thenReturn("topic");

when(sendResultData.getRecordMetadata()).thenReturn(recordMetadata);

例外情况:

org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);

Also, this error might show up because:

you stub either of: final/private/equals()/hashCode() methods.
Those methods cannot be stubbed/verified.
Mocking methods declared on non-public parent classes is not supported.

inside when() you don't call method on mock but on some other object.

at XXXXX.test(Test.java:172)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)

共有1个答案

邹阳
2023-03-14

在示例中,我没有看到您在任何地方模拟recordMetadata。您不能模拟不是模拟或被监视的对象的方法。

您应该提供一个带有注释的mock:

@Mock
private RecordMetadata recordMetadata;

或者干脆:

RecordMetadata recordMetadata = Mockito.mock(RecordMetadata.class);

此外,@mock注释应为@mock

 类似资料:
  • 我们有一个消息调度程序,它在将消息属性放入带有密钥的Kafka主题队列之前,从消息属性生成一个散列密钥。 这样做是为了消除重复。但是,我不确定如果不实际设置本地集群并检查它的运行是否符合预期,如何能够测试重复数据删除。

  • 由于一个人在单元测试和模拟之前没有经验,我使用Mockito学习了关于JUnit的初学者教程,并进行了一些实践。 现在,我需要对一些在MySQL数据库上执行基本数据库操作的类方法进行单元测试。我不想对数据库进行真正的更改。 在不访问真实数据库的情况下,是否存在验证类似方法的方法?还是我误解了单元测试和嘲笑的概念?

  • 我试图模拟Kafka抛出的CommitFailedException。 我手动将“session.timeout.ms”设置为10000毫秒,将“enable.auto.commit”设置为false。 在kafkaconsumer.poll()之后,我有一个语句thread.sleep(12000),然后我执行提交。我预计,由于线程在下一轮轮询之前的时间为12s,所以使用者应该被标记为已死,并且

  • 问题内容: 我已经开始在一个拥有数以百计的表和视图的数据库的地方工作,所有这些表和视图都具有隐秘的名称,只有很少的元音,并且没有文档。它们也不允许对数据库架构进行无谓的更改,我也不能触摸任何数据库,除非要在我自己的计算机上进行测试(该数据库会被删除并定期重新创建),因此我无法添加对任何人都有用的注释。 我尝试使用“ Toad”创建一个ER图,但是连续运行48小时后,它仍然看不到任何可见的东西,我需

  • 我有一个具有@Slf4j注释的类。 我试着写一个测试和模拟记录仪,但它不起作用。 测试是这样的: 这是我得到的错误: 问题是,如何嘲笑伐木工?

  • 我正在尝试对服务方法进行单元测试。服务方法调用spring数据存储库方法来获取一些数据。我想模拟这个存储库调用,并自己提供数据。如何做到这一点?在Spring Boot文档之后,当我模拟存储库并在测试代码中直接调用存储库方法时,模拟工作正常。但是,当我调用服务方法时,反过来调用存储库方法,mocking就不起作用了。下面是示例代码: 服务级别: 测试等级: