gpt4 book ai didi

java - 断言 JMockit 期望结果与构造的实例相同

转载 作者:太空宇宙 更新时间:2023-11-04 12:46:17 25 4
gpt4 key购买 nike

这是一个从现实生活中剥离出来的方法...真正的方法还可以做其他事情,但我已经将一些奇怪的行为缩小到了这几行。考虑一个尝试从 java.util.Date 创建 java.sql.Timestamp 的方法...(不要介意我在这个方法中是否做错了什么;这不是重点):

public class MyTest {

public Timestamp convertDateToTimestamp(Date d) {
long l = d.getTime();
Timestamp ts = new Timestamp(l);
return ts;
}

}

因此我为此方法编写了以下 JMockit JUnit 测试用例:

@RunWith(JMockit.class)
public class MyTestTest {

@Tested MyTest test;

@Test
public void testConvertDateToTimestamp(@Mocked final Timestamp ts, @Mocked final Date d) throws Exception {
new Expectations() {
{
d.getTime(); result = 8675309l;
new Timestamp(8675309l); result = ts;
}
};

Timestamp retval = test.convertDateToTimestamp(d);
assertThat(retval, sameInstance(ts));
}

}

请注意最后一行中的断言...我认为我应该确定我得到的实例与构造函数创建的实例完全相同。

这个测试返回一个非常奇怪的结果:

java.lang.AssertionError: 
Expected: sameInstance(<java.sql.Timestamp@6e3c1e69>)
but: was <java.sql.Timestamp@6e3c1e69>
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
at com.example.dcohl.MyTestTest.testConvertDateToTimestamp(MyTestTest.java:32)
...

有人能解释一下吗?我的断言失败了,因为它期望有一个 Timestamp 实例,但它却得到了...完全相同的 Timestamp 实例?

现在,如果我使用 is(ts) 而不是 sameInstance(ts) 检查相等性,我的测试就会成功。是否是同一个对象并不重要;平等就足够了。但这是一个令人头疼的结果......

最佳答案

当测试记录构造函数期望时,例如 new Timestamp(8675309l); result = ts; ,仅表示 future Timestamp通过匹配构造函数调用创建的实例在逻辑上等同于 ts模拟实例(即,它们将具有与 ts 上记录/验证的相同的模拟行为)。这并不意味着它们将是同一个实例;它们仍然是新实例。

关于java - 断言 JMockit 期望结果与构造的实例相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36294309/

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