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

Mockito抛出KafKatemPlate.Send使用thenThrow的异常

夏令秋
2023-03-14

我在测试跟随功能。

public boolean produceNumberOfPeople(NumberOfPeopleInPlaceDTO numberOfPeopleInPlaceDTO) {
    final ProducerRecord<Integer, Integer> record = new ProducerRecord<>(
        KafkaConfig.NUMBER_OF_PEOPLE_BY_PLACE_TOPIC,
        numberOfPeopleInPlaceDTO.getId(),
        numberOfPeopleInPlaceDTO.getNumberOfPeople());
    try {
        kafkaTemplate.send(record).get(2, TimeUnit.SECONDS);
        return true;
    }
    catch (ExecutionException | TimeoutException | InterruptedException e) {
        return false;
    }
}

下面是测试代码。

@Test
public void produceNumberOfPeopleTest() throws InterruptedException, ExecutionException, TimeoutException {
    NumberOfPeopleInPlaceDTO numberOfPeopleInPlaceDTO = NumberOfPeopleInPlaceDTO.builder()
                .id(1)
                .numberOfPeople(10)
                .build();
    Mockito.when(kafkaTemplate.send(Mockito.any(ProducerRecord.class)))
        .thenReturn(listenableFuture);
    Mockito.when(listenableFuture.get(2,TimeUnit.SECONDS))
        .thenThrow(TimeoutException.class);
    Assert.assertFalse(placeService.produceNumberOfPeople(numberOfPeopleInPlaceDTO));
}

我定义了以下变量。

java prettyprint-override">@Autowired
private PlaceService placeService;
@MockBean
private PlaceRepository placeRepository;
@MockBean
private KafkaTemplate<Integer, Integer> kafkaTemplate;
@MockBean
private ListenableFuture listenableFuture;

问题是kafkatemplate.send(record).get(2,timeunit.seconds)不会引发异常。所以测试一直失败。

请告诉我我缺少的东西。

共有1个答案

郗欣嘉
2023-03-14

我将建议创建带有异常的失败的ListenableFuture对象,而不是Mock

SettableListenableFuture<SendResult<String, Object>> future = new SettableListenableFuture<>();
future.setException(new RuntimeException())

然后模拟返回这个

 Mockito.when(kafkaTemplate.send(Mockito.any(ProducerRecord.class))).thenReturn(listenableFuture);

因此,当调用get方法时,它会抛出executionexception

如果通过set(Object)设置了该值,则该方法返回该值;如果通过setException(Throwable)设置了异常,则该方法抛出ExecutionException;如果future被取消,则该方法抛出CancellationException。

 类似资料:
  • 我正在使用Mockito来模拟服务层的方法。 试图嘲笑以下代码行 为了嘲笑我正在使用的这个 但问题是当代码到达行

  • 问题内容: 我正在尝试嘲笑课堂。当我运行以下代码时,Mockito会引发异常: 堆栈跟踪是无限重复的以下几行: 我在这里做错了什么? 问题答案: PS!您还可以模拟对getSecurityManager()方法的静态方法调用。 模拟静态方法请参见maunal,网址为http://code.google.com/p/powermock/wiki/MockitoUsage 在类级别添加@Prepare

  • 我使用PowerMock(Mockito)模拟同一类中另一个方法的子调用。更具体地说,我有这样的东西: 现在在我的单元测试中,我能够使用间谍模拟MyMethod2的响应,并做一些类似。但是,当我做这样的事情时,会发生一些奇怪的事情:。当我在测试期间调用myClass.myMethod1()时,它会抛出一个NullPointerException,但奇怪的是,如果我使用调试器并检查,e是MyExce

  • 我正在使用ModelMapper进行NPE 目录服务测试 目录服务 目录映射器 目录库 按预期返回CatalogEntity对象,问题出现在执行返回null之后。

  • 我正在为以下Java代码编写单元测试: 我试图模拟myService抛出错误的过程。myMethod(),以便在上面代码的catch块中提取它,并抛出MyException实例。 在我的JUnit测试中(使用org.springframework.test.context.junit4. SpringJUnit4ClassRunner和Mockito),我嘲笑了MyService并将其作为Spri

  • 问题内容: 我在junit测试中使用了模仿。如何使异常发生,然后断言其具有(通用伪代码) 问题答案: __仅 Mockito 并不是处理异常的最佳解决方案, 请将Mockito 与 Catch-Exception结合使用 Mockito + 捕获异常 + AssertJ 样例代码 Mockito + Catch-Exception + Assertj完整样本 依存关系 eu.codearte.ca