扩展JUnit assertEquals

时间:2014-12-11 22:52:17

标签: java junit

我想创建一个新的assertEquals,它将预期和实际的自定义pojo作为输入。

如何扩展assertEquals的{​​{1}}?

我能做的是实现一个比较方法,该方法返回一个布尔值并将其作为JUnit library甚至assertEquals的输入,但创建我自己的assertTrue似乎更优雅。< / p>

如果相等或者引发AssertionError会返回true吗?

3 个答案:

答案 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
  1. 创建另一个派生类,例如class MyTestCase extends TestCase,并按照Assert中定义的相同方式定义自定义断言。
  2. 使用MyTestCase代替TestCase
  3. 利润!
  4. 另一种方法是定义正确的equals()方法并使用标准assertEquals()。您可以使用EqualsBuilder使用反射自动获得合理的实现。

    http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/EqualsBuilder.html

    如果您不喜欢Apache Commons,可以在Guava找到类似的工具。