Java jUnit如何测试只将数据从实体设置为dto的方法
我对只从实体获取数据并将其分配给DTO的测试方法有问题。 我将空的DTO和entityMother创建的实体传递给。该方法工作正常,但我不知道如何对此做出断言。我认为为这个DTO的每个值/属性创建断言不是测试它的正确方法 为什么我需要测试这样的方法Java jUnit如何测试只将数据从实体设置为dto的方法,java,junit,Java,Junit,我对只从实体获取数据并将其分配给DTO的测试方法有问题。 我将空的DTO和entityMother创建的实体传递给。该方法工作正常,但我不知道如何对此做出断言。我认为为这个DTO的每个值/属性创建断言不是测试它的正确方法 为什么我需要测试这样的方法 将数据从实体设置为DTO的方法具有较小的格式规范字段。比如劈开一根绳子等等 我只需要检查该方法是否没有抛出任何错误,并且没有任何字段指定空值。可能的解决方案是: 您可以将对象序列化为JSON,然后比较结果字符串。(最干净的方式) 重写匹配的to
- 将数据从实体设置为DTO的方法具有较小的格式规范字段。比如劈开一根绳子等等
我只需要检查该方法是否没有抛出任何错误,并且没有任何字段指定空值。可能的解决方案是:
- 您可以将对象序列化为JSON,然后比较结果字符串。(最干净的方式)
- 重写匹配的toString(),然后比较结果字符串
- 在测试中使用反射(检查变量名)设置几个断言条件,以检查是否存在任何空值或未映射值(错误做法)
try {
productTemplateEditService.getAndSetAvailabilities(editedTemplateDto, editedProduct);
} catch(Exception e) {
fail("Should not have thrown any exception");
}
但同样,我只会使用我希望抛出异常的方法(例如,因为它们有异常路径或使用可能抛出异常的其他代码/库)来实现这一点。任何单元测试的默认行为都是在遇到未捕获的异常时失败
所有字段均未指定空值
JUnit方法是在您的测试方法中,对您希望确保不为null的任何字段使用
如果您想要一种更通用的方法,那么还有其他类似assertj的库
或者您可以使用反射编写自己的代码,如:
for (Field f : editedTemplateDto.getClass().getDeclaredFields())
assertNotNull(f.get(editedTemplateDto))
但我不建议这样做,因为这样会使测试代码更难理解(而且可能很脆弱,因为反射本身可能很棘手)
将数据从实体设置为DTO的方法具有较小的格式
种域。比如劈开一根绳子等等
这使得单元测试有意义:验证DTO中的字段是否按预期填充。所以不要只测试notNull,而是测试
Assert.assertEquals("FieldX has a wrong value","myexpectedValue",dto.getFieldX());
通过这种方式,您可以测试拆分逻辑的行为是否符合预期
还可以在所有可选字段中使用空值对其进行测试,以验证没有得到NullPointerException。So。不做任何断言就离开测试是正确的做法吗?如果我将Assert.assertNotNull设置为每个属性,那么这将是一个正确的解决方案?不,你是对的,如果我编写一个测试,只检查该方法没有抛出异常,我至少会将它放在测试名称中(例如,`classX\u methodY\u doesNotThrowException),或者将其显式实现为try-catch断言。我已经用一个示例更新了答案。
Assert.assertNotNull
在每个字段上似乎都很冗长,但它很容易编写,并且清楚地揭示了测试的意图。如果你有很多字段,比如说超过20个字段,你可以选择使用我的答案中的通用方法。
for (Field f : editedTemplateDto.getClass().getDeclaredFields())
assertNotNull(f.get(editedTemplateDto))
Assert.assertEquals("FieldX has a wrong value","myexpectedValue",dto.getFieldX());