使用 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 文件方法顺序,甚至字母顺序)
垃圾收集暴露的竞争条件
某些代码可能容易受到竞争条件的影响,如果垃圾收集在单元测试期间启动,它可能会将其推得足够远以导致错误(或隐藏错误)
我正在测试 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 文件方法顺序,甚至字母顺序)垃圾收集暴露的竞争条件
某些代码可能容易受到竞争条件的影响,如果垃圾收集在单元测试期间启动,它可能会将其推得足够远以导致错误(或隐藏错误)