使用 InputStream 的单元测试在 IntelliJ 中通过但在 Maven 中失败

Unit tests using InputStream pass in IntelliJ but fail in Maven

我正在测试 class,它验证 InputStream 的 XML 内容。 所以我根据我想要得到的断言传递了各种 XML 字符串。

奇怪的是,当我 运行 我的测试 Class 中的测试 它们都通过了。当我 运行 通过 Maven 测试 (安装或测试命令相同)时,断言是错误的,因为它们 return 总是一个空字符串(我想要获取错误字符串:如果 XML 格式正确,则为空,如果根据我的特定项目的标准,输入中的 XML 格式不正确,则带有错误描述。

这里我附上一个测试例子,如果运行从test class命令通过,当用maven test命令执行时失败:

@Test
public void NumeroTagDifformeListaProcessi() throws IOException {
    InputStream inputStream = IOUtils.toInputStream("<?xml version='1.0' encoding='UTF-8'?><RequestModel><codiceProdotto>GFDT4536</codiceProdotto><numeroPolizza>12345</numeroPolizza><numeroPropComp>5463</numeroPropComp></RequestModel>", "UTF-8");
    assertEquals("Il numero dei tag non corrisponde al modello. Il tag banca e' mancante nella richiesta. ", RequestValidator.validate(inputStream, RequestModel.class, "requestmodel"));
}

这是 Maven 编辑的 return 错误:

Failed tests: 
RequestValidatorTest.NumeroTagDifformeListaProcessi:42 expected:<[Il numero dei tag non corrisponde al modello. Il tag banca e' mancante nella richiesta. ]> but was:<[]>

您的问题是由单元测试冲突引起的。

造成这种情况的原因有多种:

  • 全局应用程序缓存使用不当

    有时,多个单元测试可能会访问同一个缓存,如果class没有在编写时考虑到正确的线程安全,这将导致冲突

  • 静态变量使用不当

    如果被测方法使用静态变量,但从不在方法内部重置它们(与在构造 class 时重置(初始化)它们相反),这将导致问题。

  • File/class/method排序

    不同的测试运行器可能会以不同的顺序执行测试,即使在同一平台上,Windows 上的大多数工具按字母顺序执行测试,但有些按 aAb.YzZ 的顺序执行测试,并且abc...XYZ 中的其他方法,这甚至可能扩展到 class 文件的实际方法(java 文件方法顺序,class 文件方法顺序,甚至字母顺序)

  • 垃圾收集暴露的竞争条件

    某些代码可能容易受到竞争条件的影响,如果垃圾收集在单元测试期间启动,它可能会将其推得足够远以导致错误(或隐藏错误)