我想创建一个新的assertEquals
,它将预期和实际的自定义pojo作为输入。
如何扩展assertEquals
的{{1}}?
我能做的是实现一个比较方法,该方法返回一个布尔值并将其作为JUnit library
甚至assertEquals
的输入,但创建我自己的assertTrue
似乎更优雅。< / p>
如果相等或者引发AssertionError会返回true吗?
答案 0 :(得分:2)
有an overload of assertEquals
that takes objects。它(eventually) calls the equals
method on both objects。因此,您需要编写的“比较”方法是覆盖Object
的{{1}}方法。
一旦你写了,那么你可以打电话给equals
。对于这种情况,没有必要扩展JUnit。
另外,如果您覆盖assertEquals("Failure message", yourObject1, yourObject2)
,那么您也应该以一致的方式覆盖equals
。
答案 1 :(得分:2)
正如@Makoto评论的那样,你可以使用自定义的Hamcrest匹配器。
这里另一个常见答案的缺点(只是改变你的类的Object#equals的定义),你将只有一种方法来比较你的对象,它必须完全匹配所需的通过测试而不是该类用户所需要的。这两个需求可能相同也可能不相同。通常在测试中,我只需要断言一个或两个值,有时几个,但通常不会被&#34;自然&#34;我班的#equals方法。此外,我与许多课程合作,甚至没有明确覆盖#equals。在这些情况下,您必须定义一个仅适用于您的测试的情况,而在语义上可能不能很好地代表该域。
答案 2 :(得分:0)
断言是静态方法,在Assert
类中定义。 TestCase
派生自该类,因此所有断言也都可用。
java.lang.Object
|
+--junit.framework.Assert
|
+--junit.framework.TestCase
class MyTestCase extends TestCase
,并按照Assert
中定义的相同方式定义自定义断言。MyTestCase
代替TestCase
另一种方法是定义正确的equals()
方法并使用标准assertEquals()
。您可以使用EqualsBuilder
使用反射自动获得合理的实现。
如果您不喜欢Apache Commons
,可以在Guava
找到类似的工具。