【发布时间】:2019-06-02 03:04:54
【问题描述】:
在我的班级的某个单元测试中,我想断言已为所有成员字段编写了一个断言。也就是说,给定
public class Foo {
int a;
int b;
String c;
}
我想做类似的事情
@Test
public void testFieldsAgainstExternalModel(Foo model, Bar externalModel) {
assertEquals(model.a, externalModel.getA());
assertEquals(model.b, externalModel.getSomethingNamedDifferently());
assertEquals(model.c, externalModel.getC().toString());
assertNumberOfAssertionsInThisTest(3); // <-- How do I do this?
}
当然,计算断言的数量并不能确保它们与每个具有断言的字段有任何关系。但是,如果开发人员将字段添加到 Foo 并忘记更新此测试,我只是想编写一个失败的测试。
最简单的方法:我能想到的最简单的方法是使用反射来断言
Foo拥有的字段数量,例如assertEquals(3, Foo.getDeclaredFields().count())。但是,我可以很容易地看到程序员在没有实际添加断言的情况下增加了数字。仍然是一种幼稚的方法,但可以接受:我认为如果我至少可以统计断言的数量,它将足以引导程序员达到预期的需求.
更准确的方法:当然,最好的方法似乎是实际保留一个表,其中包含断言中出现的字段(例如通过包装像
assertEqualsWithCounters) 这样的方法,但实际上我的情况有点复杂。例如,我的模型实际上是一个生成的类 (@AutoMatter),我将在断言的两边都使用 getter,因此很难真正推断出断言“触及”了哪个字段。这就是为什么只计算断言并对实际类型和计数保持不可知论对我来说是最简单的。
【问题讨论】:
-
一个更简单的方法是 (1) 使用 Lombok 使您的类生成一个 toString,因此您知道它包含所有成员变量。 (2) 只是比较toString的结果。
-
@Zag 但是依赖解析 toString() 输出是非常糟糕的做法。如果那个类已经有一个 toString() 了,或者有些有呢?
-
使用OpenPOJO。