gpt4 book ai didi

java - 测试依赖时间的服务方法

转载 作者:行者123 更新时间:2023-11-28 20:45:49 24 4
gpt4 key购买 nike

我正在尝试使用一种在数据库表中查找当前“处理周期”的方法为服务编写集成测试。但是,并不总是有一个活跃的处理周期,因此该方法可能会返回 null(有几周没有处理发生)。我想为此方法编写一个 JUnit 测试,但由于它不会总是返回一个值,因此我会根据运行测试的时间得到不同的结果。

period 对象和服务如下所示:

public interface ProcessingPeriod {
int getSeqno();
Date getStart();
Date getEnd();
}

public class PeriodService {
/* Look up the current period; if not currently in a period, return null */
public ProcessingPeriod getCurrentPeriod() { /* execute a sql query */ }

/* Look up the current period; if not currently in a period, get the next upcoming period */
public ProcessingPeriod getCurrentOrNextPeriod() { /* execute a sql query */ }

/* Look up the current period; if not currently in a period, get the most recent period */
public ProcessingPeriod getCurrentOrPreviousPeriod() { /* execute a sql query */ }
}

PeriodService 的实例由 Spring 应用程序上下文管理,我的 JUnit 测试使用 SpringJUnit4ClassRunner 构建测试上下文并向测试提供服务对象。我的 JUnit 测试目前看起来像:

@Test
public void testGetCurrentPeriod() {
ProcessingPeriod period = service.getCurrentPeriod();
if (period != null) {
Date now = new Date();
assertThat(period.getStart(), lessThanOrEqualTo(now));
assertThat(period.getEnd(), greaterThanOrEqualTo(now));
}
}

但如果在处理期间不运行测试,这似乎不会有太大帮助。我如何才能有意义地测试 getCurrentPeriod 方法实际上从数据库中获取了正确的时间段?我应该 mock 数据库吗?我还想实际执行对数据库的查询,以帮助确保 SQL 有效。

最佳答案

我没有在我的代码中使用 new Date()getCurrentTimeMillis() 等。我总是使用包含我需要的所有时间相关方法的时间提供程序。

interface TimeProvider {
Date getDate();
int getCurrentQuarter();
...
}

生产实现是显而易见的。但是,对于测试,您可以放置​​您需要的任何提供程序,以便您可以在测试中设置您喜欢的任何时间。它适用于 Spring 。但它仅在您测试不使用它自己的内部时钟( sleep 、锁定、 quartz 等)的代码时才有效。

看起来它适合您的示例,但您将不得不重构您的生产代码

关于java - 测试依赖时间的服务方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10507955/

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