我有一个测试类,有一个
ParameterizedTest
和 CsvSource
以及其他使用 CapturedOutput
的测试。它们单独运行良好,但一起运行时会随机失败并显示 NoSuchElementException
。
以下是示例代码:
@ExtendWith({MockitoExtension.class, OutputCaptureExtension.class})
class SampleTest {
// Few Mocks and InjectMock
@ParameterizedTest
@CsvSource({"foo,hi-foo", "bar,hi-bar"})
void someTest(String input, String output) {
assertEquals(output, "hi-" + input);
}
@Test
void anotherTest(CapturedOutput capturedOutput) {
assertFalse(capturedOutput.getAll().contains("Checking some logs"));
}
@Test
void lastTest(CapturedOutput capturedOutput) {
assertFalse(capturedOutput.getAll().contains("Again checking some logs"));
}
}
关于如何解决这个问题有什么想法吗?
PS:我无法创建另一个测试文件。
解决方案是使用JUnit5中的
Nested
类。我从根类中删除了 OutputCaptureExtension
并将其添加到 Nested
类之上,效果很好。
@ExtendWith(MockitoExtension.class)
class SampleTest {
// Few Mocks and InjectMock
@ParameterizedTest
@CsvSource({"foo,hi-foo", "bar,hi-bar"})
void someTest(String input, String output) {
assertEquals(output, "hi-" + input);
}
@Nested
@ExtendWith(OutputCaptureExtension.class)
class NestedTest {
@Test
void anotherTest(CapturedOutput capturedOutput) {
assertFalse(capturedOutput.getAll().contains("Checking some logs"));
}
@Test
void lastTest(CapturedOutput capturedOutput) {
assertFalse(capturedOutput.getAll().contains("Again checking some logs"));
}
}
}
我有类似的问题和有趣的修复。
我正在编写一个单元测试,该测试应该具有 CapturedOutput 来在日志上断言,并且还可以与 @CsvSource 一起使用。 我的测试如下所示
@ExtendWith({OutputCaptureExtension.class, MockitoExtension.class})
class SampleTest {
@ParameterizedTest
@CsvSource({"foo,hi-foo", "bar,hi-bar"})
void someTest(final CapturedOutput output, final String input, final String output) {
assertEquals(output, "hi-" + input);
assert(output).contains("expected logs")
}
但是,当我运行单元测试时,出现以下错误。
Discovered multiple competing ParameterResolvers for parameter [final org.springframework.boot.test.system.CapturedOutput output]
org.junit.jupiter.api.extension.ParameterResolutionException: Discovered multiple competing ParameterResolvers for parameter [final org.springframework.boot.test.system.CapturedOutput output]
在敲了我的头几分钟后,尝试重新排序参数,效果非常好。
@ParameterizedTest
@CsvSource({"foo,hi-foo", "bar,hi-bar"})
void someTest(final String input, final String output,final CapturedOutput output) {
assertEquals(output, "hi-" + input);
assert(output).contains("expected logs")
}
所以,这里的学习是,应该首先提供 CSVSource 的参数,最后提供 CapturedOutput 。