【问题标题】:testing current java timestamp in junit在junit中测试当前的java时间戳
【发布时间】:2015-02-10 21:49:28
【问题描述】:

我正在尝试编写一个 Junit 来测试具有当前时间戳的对象。问题是当我第一次创建当前时间戳时,如下所示:

Date date = new Date();
Timestamp timestamp = new Timestamp(date.getTime());

它创建一个时间戳对象,其当前时间包括毫秒。所以当我运行我的测试时,它们永远不会相等,因为在我创建时间戳对象和测试时间之间有一段时间以毫秒为单位:

x.setTimeToMyMethod(timestamp);
assertEquals(timestamp, x.getTimeFromMyMethod());

我尝试使用 SimpleDateFormat,但它将时间转换为字符串,而我的 setter 方法只接受 Timestamp 对象。 无论如何我可以克服这个问题吗? 提前致谢!

感谢您的回答,这是我的代码,希望它能阐明我想要做什么:

public class myTest {

    Date date = new Date();

    Timestamp timestamp = new Timestamp(date.getTime());

    myTestingClass testClass = new myTestingClass();

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
    }

    @Before
    public void setUp() throws Exception {


        testClass.setCreateDate(timestamp); 

    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void test() {
        try {


            assertEquals(timestamp, testClass.getCreateDate());

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

当我尝试运行它时,它给了我以下错误:

java.lang.AssertionError:预期: 但是 是:

【问题讨论】:

  • 你能解释一下第二个Timestamp 对象是在哪里创建的吗?在您的(简短)示例代码中,不清楚问题是在哪里引起的。
  • @Duncan 我编辑了我的问题,感谢您的评论!

标签: java junit timestamp


【解决方案1】:

我最近遇到了类似的问题。找到你的问题,但没有接受的答案,所以我想现在尝试回答,因为我设法解决了我的问题。首先,查看 myTestingClass 的代码,尤其是 setCreateDate(timestamp) 方法的代码会很有用。 AssertionError 的原因是使用了两个不同的 Timestamps 对象。我的(大)假设是当 myTestingClass 被实例化时创建一个 Timestamp 对象,而另一个在 JUnit 中创建。然后你比较这两个对象。如果你有这样的代码:

public class myTestingClass {
    // other code ...
    Timestamp timestamp;

    public void setCreateDate(Timestamp timestamp) {
        this.timestamp = timestamp;
    }

    public Timestamp getCreateDate() {
        return timestamp;
    }
}

那么创建 Timestamp 对象的时间和测试时间之间的差异将无关紧要,因为您使用同一个 Timestamp 对象并且测试会通过。

附: Date 类的大部分已被弃用,因此您应该考虑将新类用于相同目的——LocalDate / LocalTime / LocalDateTime(Java 8 及更高版本)。使用 LocalDateTime 创建时间戳如下所示:

LocalDateTime now = LocalDateTime.now();
Timestamp timestamp = Timestamp.valueOf(now);

【讨论】:

    【解决方案2】:

    您可以在测试套件中创建单个时间戳对象,通过 setter 将其设置为您正在测试的类,并在您的测试套件上对其进行验证。在这种情况下,两者都是相同的实例。

    【讨论】:

    • 这正是我试图做的,但它给了我一个错误:
    • 生成日期以及 setUp() 中的时间戳并尝试。在 setter 之后和 run 方法中打印。
    • 每个 jUnit 测试方法都有一个新的测试类实例。这就是为什么使用 setUp 和 tearDown 方法重新初始化实例变量的原因。希望这很清楚。
    猜你喜欢
    • 2010-09-11
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    相关资源
    最近更新 更多