java - 如何在 BDD 中创建良好的可重复日期测试?

标签 java spring bdd concordion

当我将业务对象插入数据库(使用 spring/hibernate)时,有一些日期字段会使用当前日期进行更新。

这是一个重要的功能,所以我想在我的可测试规范中验证它。

问题是我想查看具有正确日期的字段,但由于它是当前日期,因此每次都会更改。

我有一个可行的解决方案,但它太老套了,我无法凭良心做到这一点。

它会是这样的:

@Service
public class DateService {
  private Date fixedDate;

  public Date getCurrentDate() {
    if (fixedDate != null)
      return fixedDate;
    return new Date();
  }

  // setter / reset
}

每次我需要一个新的 Date() 时,我都会@autowired 它。然后,当测试时间时,我修正了日期,这样我就知道每个"new"日期都是这个日期。

如何在项目中创建良好的可重复的基于日期的测试?

谢谢

最佳答案

如果您可以更改底层系统,则注入(inject)备用时钟实现效果很好。例如,this answer显示了各种解决方案,包括 Java 8 的 java.time.Clock 接口(interface)。

对于系统测试,您想要测试实际实现,请使用 Concordion 规范,例如:

<p>The invoice date is set to <span c:assertEquals=getInvoiceDate()>today</span></p>

从固定装置方法返回一个字符串值,包含:

  • 如果日期是今天,则为“今天”,或者
  • 格式化日期(如果日期不是今天)。然后,这将在 Concordion 输出中显示为今天20/12/2014。

注意:使用这种方法时,请谨慎在午夜运行测试,因为您面临着检索日期和测试日期之间日期发生变化的风险。

关于java - 如何在 BDD 中创建良好的可重复日期测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27601677/

相关文章:

java - 在文件中保存数据的文件格式以及如何读取此数据 - Spring MVC

java - 如何将 spring 和 hibernate 与 eclipse 集成

python - 如何生成有用的pytest-bdd测试报告?

c# - 如何在 BeforeTestRun 中创建内容并在步骤定义中访问它

python - 为什么这个方法被调用两次(pytest)

java - 与 JPA 合并 API 等效的 SQL/JDBC 是什么?它到底有什么作用?

java - Spring Integration 去抖动/去重

java - 使用Spring RetryTemplate时获取当前的退避值

java - 如何删除 JSONObject 字符串引号前的反斜杠?

java - 分割字符串以将每个单词与数组列表进行比较