繁体   English   中英

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

[英]jUnit how to test methods that only set data from entity to dto

我在测试方法方面遇到了问题,这些方法只从实体获取数据并将其分配给 DTO。 我通过了空的 DTO,以及由 entityMother 创建的实体。 该方法工作正常,但我不知道如何对此进行断言。 我认为为这个 DTO 的每个值/属性创建断言并不是测试它的正确方法。

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

  • 将数据从实体设置为 DTO 的方法具有小的格式特定字段。 像分割字符串等。
@Test
    public void shouldSetAvailabilities() {
        EditedTemplateShowDto editedTemplateDto = new EditedTemplateShowDto();
        productTemplateEditService.getAndSetAvailabilities(editedTemplateDto, editedProduct);

        //Here should be condition which check that the metod set data
    }

我只需要检查该方法是否没有抛出任何错误,并且没有任何字段分配了空值。

可能的解决方案是:

  • 您可以将对象序列化为 JSON,然后比较结果字符串。 (最干净的方式)
  • 覆盖匹配的 toString() 然后比较结果字符串。
  • 在测试中使用反射(检查变量名称)放置几个断言条件,以检查没有任何空值或未映射值(不良做法)。

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

首先,你不需要测试任何东西。 如果您觉得代码非常简单,那么我建议您将时间花在其他事情上。 或者也许编写一个全面的测试,这样至少你有代码覆盖率(但 IMO 你会做更多的统计而不是你的产品的实际质量)。

我只需要检查该方法没有抛出任何错误

这很容易! 只需编写一个调用该方法的单元测试。 如果该方法抛出任何异常,则测试将失败。 如果你想让你的测试方法更能揭示意图,你可以明确地写成这样:

try {
      productTemplateEditService.getAndSetAvailabilities(editedTemplateDto, editedProduct);
   } catch(Exception e) {
      fail("Should not have thrown any exception");
   }

但同样,我只会使用我希望抛出异常的方法来执行此操作(例如,因为它们具有异常路径或使用其他可能抛出异常的代码/库)。 任何单元测试的默认行为都是在遇到未捕获的异常时失败。

没有任何字段分配空值。

JUnit 方法是在您要确保不为空的任何字段的测试方法中使用assertNotNull

如果您想要更通用的方法,还有其他库,例如 assertj 的hasNoNullFieldsOrProperties

assertThat(editedTemplateDto).hasNoNullFieldsOrProperties();

或者您可以使用反射编写自己的代码,例如:

for (Field f : editedTemplateDto.getClass().getDeclaredFields())
    assertNotNull(f.get(editedTemplateDto))

但是我建议不要这样做,因为它会使您的测试代码更难理解(并且可能很脆弱,因为反射本身可能很棘手)

将数据从实体设置为 DTO 的方法具有小的格式特定字段。 像分割字符串等。

这使单元测试变得有意义:验证 DTO 中的字段是否按预期填充。 所以不要只测试 notNull 而是测试

Assert.assertEquals("FieldX has a wrong value","myexpectedValue",dto.getFieldX());

通过这种方式,您可以测试拆分逻辑的行为是否符合预期。

还要在所有可选字段中使用空值对其进行测试,以验证您没有收到 NullPointerException。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM