2012-04-24 48 views
0

我将不得不编写测试用例来检查某些查询的工作说,这检索与日期今天next_week,previous_year记录等。日期和日期时间处理 - 一个特定的场景中失败

它的JUnit测试用例基本上,我正在通过实施:

1.Inserting记录与日期对应到今天,NEXT_WEEK,PREVIOUS_YEAR

2.So,我就知道一个特定查询,要返回的记录是什么,我将执行查询,检索特定条件的记录并检查它是否有正确的记录。

在这个过程中,在执行TODAY的情况下,我面临一个问题。

如果我在午夜运行我的测试情况下,说11.59,数据的第一插入会发生,这将插入一个日期,说24-4-2012T11:59:00.00

和在执行之前查询,日期变为明天,即25-4-2012T00:00:00.00

“今日”条件将执行查询,查询次数为25次而不是24次。所以我的测试用例失败了。

我该如何解决这个问题?

回答

5

我该如何解决这个问题?

多写测试代码:)

我的猜测是,你正在做的“当前日期”使用System.currentTimeMillis()Calendar.getInstance()或类似的东西。该代码不容易被拦截,给你“任何你想要的价值”。相反,使用单一方法(now()或类似方法)引入一个接口,返回您想要使用的“现在”的任何表示形式。 (个人情况下,我会使用Joda Time中的Instant,但这取决于您。)

现在将Clock注入要测试的代码中,例如,作为参数构造函数。对于测试,使用一个存根实现,它返回你想要的任何东西。对于生产,使用“真实”的实现。

+0

谢谢Jon Skeet。我是否理解正确,我必须从我自己的Clock中返回一个now()值,该值将被插入到数据库中,然后在查询中用于检索? – Sowmiya 2012-04-26 09:34:27

+0

@Sowmiya:你是否使用它来插入是一个不同的问题(我们不知道数据代表什么) - 但你至少会用它来查询,以便你知道“今天”是什么意思。 – 2012-04-26 09:40:25

+0

在这里,我的检索过程就像,我将发射一个服务GetRecordsForToday,在那里我不能指定任何日期,但该服务负责在后端操纵日期Today。 [我正在测试使用一个服务的**插入的工作**和**使用另一个服务的检索 - 今天总是在今天** :(] – Sowmiya 2012-04-26 09:47:51

0

假设您使用new Date()作为今天的概念。您应该保留保留的比较日期;我相信这是问题的根源,你需要之前和查询执行后保留的预期值是可测试/可验证:

Date today = new Date(); 

// update the data layer using today 

Date recordedDate = // fetch the date that is recorded 

assertEquals(today, recordedDate); 

想必,你会使用一些其他的设施,如java.util.Calendar计算时间在你的问题中提到的点。

+0

但是这个解决方案与原来的问题相同 - 日期可能会在两个调用'new Date()'之间改变。 – 2012-04-24 06:48:17

+0

只有_on_调用'new Date()'在'today'中预先保存它;这就是我想要的代码听起来像。 – nobeh 2012-04-24 06:54:47

+0

感谢您的提示。但基本上,我将在午夜存储日期并保存它。我需要从数据库查询今天的日期值并检查保留的日期,以查询[明天的第一分钟会发生哪种情况]。那么,在这种情况下,它会失败吗? :) – Sowmiya 2012-04-24 11:38:38