微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何杀死关于时间的条件边界突变

如何解决如何杀死关于时间的条件边界突变

我正在尝试测试以下课程

@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(),代码就可以正确地进行单元测试了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。