问题描述
我正在尝试测试以下课程
@Component
public class StreamListener {
@Value("${kafkaMessageExpiration.maxExpirationInMilliseconds}")
private long messageExpirationTime;
public void handleMessage(Payment payment) {
logIncomingDirectDepositPayment(payment);
if (!isMessageExpired(payment.getLastPublishedDate())) {
messageProcessor.processpayment(payment);
}
}
private boolean isMessageExpired(OffsetDateTime lastPublishedDate) {
return ChronoUnit.MILLIS.between(lastPublishedDate.toInstant(),Instant.Now()) > messageExpirationTime;
}
}
关于 isMessageExpired() 中的条件,我收到“已更改条件边界 → SURVIVED”消息。
我进行了以下测试,用于测试差异何时小于 messageExpirationTime 以及差异何时大于 messageExpirationTime。
@BeforeEach
void init() {
ReflectionTestUtils.setField(streamListener,"messageExpirationTime",60000);
}
@Test
void handleMessage() {
Payment payment = TestObjectBuilder.createPayment();
streamListener.handleMessage(incomingDirectDepositPayment);
verify(messageProcessor).processDirectDepositPayment(incomingDirectDepositPayment);
}
@Test
void handleMessage_expired_message() {
Payment payment = TestObjectBuilder.createPayment();
payment.setLastPublishedDate(OffsetDateTime.Now(ZoneId.of("UTC")).minusMinutes(10));
streamListener.handleMessage(incomingDirectDepositPayment);
verify(messageProcessor,never()).processDirectDepositPayment(incomingDirectDepositPayment);
}
我怀疑问题在于我没有进行差异相等的测试。假设这就是我所缺少的,我不知道如何使差异相等。关于如何杀死这种突变的任何建议?
顺便说一句,我使用的是 Java 11、JUnit 5 和 PITest 1.6.3
解决方法
这个问题是这样的
Instant.now()
如果时间是您的代码所依赖的输入之一,您需要明确表示,以便您可以控制它。
这通常是通过注入 java.util.Clock
(作为字段,通过构造函数注入)来实现的。然后可以将您对 Instant.now()
的调用替换为 clock.instant()
,代码就可以正确地进行单元测试了。