Java jUnit如何测试只将数据从实体设置为dto的方法

Java jUnit如何测试只将数据从实体设置为dto的方法,java,junit,Java,Junit,我对只从实体获取数据并将其分配给DTO的测试方法有问题。 我将空的DTO和entityMother创建的实体传递给。该方法工作正常,但我不知道如何对此做出断言。我认为为这个DTO的每个值/属性创建断言不是测试它的正确方法 为什么我需要测试这样的方法 将数据从实体设置为DTO的方法具有较小的格式规范字段。比如劈开一根绳子等等 我只需要检查该方法是否没有抛出任何错误,并且没有任何字段指定空值。可能的解决方案是: 您可以将对象序列化为JSON,然后比较结果字符串。(最干净的方式) 重写匹配的to

我对只从实体获取数据并将其分配给DTO的测试方法有问题。 我将空的DTO和entityMother创建的实体传递给。该方法工作正常,但我不知道如何对此做出断言。我认为为这个DTO的每个值/属性创建断言不是测试它的正确方法

为什么我需要测试这样的方法

  • 将数据从实体设置为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());