Java 扩展JUnitAsserteQuals

Java 扩展JUnitAsserteQuals,java,junit,Java,Junit,我想创建一个新的assertEquals,它接受预期和实际的自定义pojo作为输入 我如何扩展JUnit库的assertEquals 我能做的是实现一个compare方法,它返回一个布尔值,并将其作为assertEquals甚至assertTrue的输入,但创建自己的assertEquals似乎更优雅 如果相等,是否会返回true或引发断言错误?有。信息技术所以,您需要编写的比较方法是重写对象的equals方法 一旦编写好了,就可以调用assertEqualsFailure消息,yourObje

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

我如何扩展JUnit库的assertEquals

我能做的是实现一个compare方法,它返回一个布尔值,并将其作为assertEquals甚至assertTrue的输入,但创建自己的assertEquals似乎更优雅

如果相等,是否会返回true或引发断言错误?

有。信息技术所以,您需要编写的比较方法是重写对象的equals方法

一旦编写好了,就可以调用assertEqualsFailure消息,yourObject1,yourObject2。对于这种情况,不需要扩展JUnit

另一方面,如果重写equals,那么也应该以一致的方式重写hashCode。

有。信息技术所以,您需要编写的比较方法是重写对象的equals方法

一旦编写好了,就可以调用assertEqualsFailure消息,yourObject1,yourObject2。对于这种情况,不需要扩展JUnit


另一方面,如果重写equals,那么也应该以一致的方式重写hashCode。

断言是静态方法,在Assert类中定义。TestCase派生自该类,因此所有断言也都在该类中可用

java.lang.Object
  |
  +--junit.framework.Assert
        |
        +--junit.framework.TestCase
创建另一个派生类(如MyTestCase类)可以扩展TestCase,并在那里以与在Assert中定义自定义断言相同的方式定义自定义断言。 使用MyTestCase而不是TestCase 利润 另一种方法是定义适当的equals方法并使用标准assertEquals。您可以使用EqualsBuilder通过反射自动获得合理的实现


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

断言是静态方法,在Assert类中定义。TestCase派生自该类,因此所有断言也都在该类中可用

java.lang.Object
  |
  +--junit.framework.Assert
        |
        +--junit.framework.TestCase
创建另一个派生类(如MyTestCase类)可以扩展TestCase,并在那里以与在Assert中定义自定义断言相同的方式定义自定义断言。 使用MyTestCase而不是TestCase 利润 另一种方法是定义适当的equals方法并使用标准assertEquals。您可以使用EqualsBuilder通过反射自动获得合理的实现


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

正如@Makoto所评论的,您可以使用定制的Hamcrest Matcher


这里的另一个常见答案的缺点是更改类的Objectequals定义,即您将有一种且只有一种方法来比较对象,并且它必须精确匹配测试所需的内容,而不是类用户所需的内容。这两种需求可能相同,也可能不同。通常在测试中,我只需要声明一个或两个值,有时是几个值,但通常不需要通过类的natural equals方法测试什么。此外,我处理的很多类甚至没有显式重写equals。在这些情况下,您必须定义一个仅适用于您的测试的匹配器,而它在语义上可能无法很好地表示域。

正如@Makoto所评论的,您可以使用自定义的Hamcrest匹配器


这里的另一个常见答案的缺点是更改类的Objectequals定义,即您将有一种且只有一种方法来比较对象,并且它必须精确匹配测试所需的内容,而不是类用户所需的内容。这两种需求可能相同,也可能不同。通常在测试中,我只需要声明一个或两个值,有时是几个值,但通常不需要通过类的natural equals方法测试什么。此外,我处理的很多类甚至没有显式重写equals。在这些情况下,您必须定义一个仅适用于您的测试的方法,而它在语义上可能无法很好地表示域。

为什么不在POJO中重写equals和hashCode方法,并使用assertEqualsObject,Object。这不是一个选项吗?覆盖对象的equals/hashCode不是更容易吗?这听起来很完美。你也可以使用自定义,从长远来看,它可能更具表现力,并且不需要equals来封装您在这个POJO中只关心的所有内容。为什么不在POJO中重写equals和hashCode方法,并使用assertEqualsObject,Object。这不是一个选项吗?覆盖对象的equals/hashCode不是更容易吗?这听起来很完美。你也可以使用一个自定义,从长远来看,它可能更具表现力,不需要equals来封装你在这个POJO中只关心的所有内容。你描述的是JUnit 3,这已经过时多年了。是的,你是对的。它没有过时。问安卓f
OLK-他们仍在积极使用JUnit3,这有点令人伤心。。。不过,此解决方案也适用于JUnit4 fine。如果您不想使用派生测试用例,您可以始终实现自定义的MyAssert.AssertFancyStuffoObject a、Object b,并以通常使用Assert.assertEquals静态方法的方式使用它。这样更容易,而且。。。你为什么要这样做?如果要编写自己的assertEquals方法,可以将其放入测试类本身,也可以将其放入某个实用程序类中。即使您有JUnit 3,还有人使用JUnit 3吗?没有必要在类层次结构中引入一个全新的级别。@DavidWallace是的,很多Android用户仍然使用它。是的,我知道Android Java已经不是Java语言了。将断言放在基类中可能有用,也可能无用。如果您的测试共享一些常见的东西,那么将其放在基类中不是一个坏主意。您描述的是JUnit 3,它已经过时多年了。是的,您是正确的。它没有过时。问问安卓用户——他们仍然在积极使用JUnit3,这有点令人伤心。。。不过,此解决方案也适用于JUnit4 fine。如果您不想使用派生测试用例,您可以始终实现自定义的MyAssert.AssertFancyStuffoObject a、Object b,并以通常使用Assert.assertEquals静态方法的方式使用它。这样更容易,而且。。。你为什么要这样做?如果要编写自己的assertEquals方法,可以将其放入测试类本身,也可以将其放入某个实用程序类中。即使您有JUnit 3,还有人使用JUnit 3吗?没有必要在类层次结构中引入一个全新的级别。@DavidWallace是的,很多Android用户仍然使用它。是的,我知道Android Java已经不是Java语言了。将断言放在基类中可能有用,也可能无用。如果您的测试共享一些公共内容,那么将其放在基类中并不是一个坏主意。