OutputCaptureExtension 和 ParameterizedTest 不能一起工作

问题描述 投票:0回答:2

我有一个测试类,有一个

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:我无法创建另一个测试文件。

java spring-boot junit mockito junit5
2个回答
1
投票

解决方案是使用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"));
        }
    }
}

0
投票

我有类似的问题和有趣的修复。

我正在编写一个单元测试,该测试应该具有 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 。

© www.soinside.com 2019 - 2024. All rights reserved.