gpt4 book ai didi

java - 使用 jmockit 测试 foreach 循环

转载 作者:行者123 更新时间:2023-12-02 05:24:49 25 4
gpt4 key购买 nike

我正在尝试为 foreach 循环中的逻辑编写单元测试,但由于“缺少调用”异常而失败。

调试时我发现 s3EventNotification.getRecords().size() 为 0。什么解释了缺少调用错误,但我不知道如何让它进入循环。我还尝试添加到期望 block

s3EventNotificationRecords.size();
result = 1;

为了让s3EventNotification.getRecords().size() = 1,但仍然没有进入循环。

下面是我正在尝试测试的方法:

public void receiveMessages(String msg) throws IOException {
logger.info("Message received to queue. Message = " +msg );
try {
ObjectMapper mapper = new ObjectMapper();
S3EventNotification s3EventNotification = mapper.readValue(msg, S3EventNotification.class);

s3EventNotification.getRecords().forEach(record -> {
S3EventNotification.S3Entity s3Entity = record.getS3();

S3Object s3Object = s3Service.getS3Object(s3Entity.getBucket().getName(), s3Entity.getObject().getKey());
});
} catch (Exception e) {
logger.error("error handling message",e);
throw e;
}
}

以及我编写的测试:

public class DemoAppTest {

@Tested
private DemoApp demoApp;

@Injectable
private S3Service s3Service;

@Mocked
private ObjectMapper mapper;

@Mocked
private S3EventNotification s3EventNotification;

@Mocked
private S3EventNotification.S3EventNotificationRecord s3EventNotificationRecord;

@Mocked
private S3EventNotification.S3Entity s3Entity;

@Mocked
private S3Object s3Object;

@Mocked
private List<S3EventNotification.S3EventNotificationRecord> s3EventNotificationRecords;

private String msg ="msg";

@Test
public void receiveMessagesTest() throws IOException {
new Expectations(){
{
new ObjectMapper();
result = mapper;

mapper.readValue(msg, s3EventNotification.getClass());
result = s3EventNotification;

s3EventNotification.getRecords();
result = s3EventNotificationRecords;

s3EventNotificationRecord.getS3();
result = s3Entity;

s3Service.getS3Object(s3Entity.getBucket().getName(), s3Entity.getObject().getKey());
result = s3Object;
}
};

demoApp.receiveMessages(msg);
}
}

我得到的错误是:

Missing 1 invocation to:
com.amazonaws.services.s3.event.S3EventNotification$S3EventNotificationRecord#getS3()
on mock instance: com.amazonaws.services.s3.event.S3EventNotification$S3EventNotificationRecord@6c61a903

我将非常感谢任何帮助。谢谢!

最佳答案

在较新版本的 JMockit 中不允许模拟列表,这就是让您感到悲伤的原因。

将 s3EventNotificationRecords 更改为实际的 ArrayList(而不是模拟的)。然后,使用模拟实体填充该列表。

s3EventNotificationRecords = new ArrayList<>();
s3EventNotificationRecords.add(s3EventNotificationRecord);

现在,当测试运行时,JMockit 将模拟对 getRecords() 的调用,导致测试使用如上填充的(真实的,但测试提供的)数组列表。然后,代码将运行 forEach 并提取模拟的 s3EventNotificationRecord 实例。然后,代码将在模拟实例上调用 getS3(),并且测试应使用 s3Entity 继续进行。

关于java - 使用 jmockit 测试 foreach 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56240482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com