是否应该覆盖等于在单元测试中断言对象相等性的方法?

时间:2009-07-24 20:37:12

标签: unit-testing equals assert assertions

假设我们通过使用预期结果对象的属性断言结果对象的所有属性的相等性来测试方法的结果。我们应该实现equals方法并使用Assert.AreEqual(expectedResult,actualResult)......但是equals可能意味着生产代码中存在不同的东西。

哪种做法最好?

  • 通过overriden equals方法
  • 断言对象的相等性

  • 断言所有属性的相等性

3 个答案:

答案 0 :(得分:21)

我一个人使用自定义断言。主要有两个原因:

  • 不要将测试问题强加给生产。这意味着测试方法中equals的含义可能与生产代码的含义不一致;
  • 等于所有测试可能不够好。不同的测试需要不同的断言,所以你最终可能会使用自定义断言。

答案 1 :(得分:4)

如果您正在测试返回值对象(例如,货币值,元组或映射)的方法或函数的返回值,那么检查结果对象是否等于预期值是有意义的结果对象。在这种情况下,equals的标准实现应该做你想要的。

同时,如果你在某个对象上调用mutator,然后检查它是否按预期变异了对象,我认为只检查那些应该被更改的对象的属性更有意义。这可以防止您不得不对equals进行自定义定义,这无论如何都会模糊您在测试中预期发生的事情。

答案 2 :(得分:3)

我不认为这个问题与标准的做事方式有关。这是一个考虑你的测试应该测试什么的问题。

如果要测试所有属性是否相等,请断言所有属性的相等性。

如果要测试整个对象的Equals方法的返回值,请改为断言。