Spring Boot 无法修复的测试容器警告

pdkcd3nj  于 2023-02-16  发布在  Spring
关注(0)|答案(1)|浏览(189)

使用Springboot 3在Junit 5中编写了一个@Testcontainers测试。测试运行并通过,但我有以下警告:

'MySQLContainer<SELF>' used without 'try'-with-resources statement

但是代码实际上显示了容器没有在try with resources语句之外使用:

@Testcontainers
public class PageTemplateCreationTestContainerTests {

    private static final Logger logger = LoggerFactory.getLogger(PageTemplateCreationTestContainerTests.class);

    @Test
    void mySQLContainerShouldBeRunning() {
        try (
                var mySQLContainer = new MySQLContainer<>("mysql:8.0")
                        .withLogConsumer(new Slf4jLogConsumer(logger))
        ) {
            mySQLContainer.start();
            assertThat(mySQLContainer.isRunning(), is(true));
        }
    }
}

我通读了自动关闭的文档,当然这里没有来自IntelliJ的帮助。我想它可能是在var语法上窒息,但没有。
此警告不应出现。

5us2dqdw

5us2dqdw1#

TL;DR:由于.withLogConsumer()链接调用,这是一个误报。
IntelliJ向您显示new MySQLContainer<>("mysql:8.0")不是由try-with-resources块关闭的,而是您在其上调用.withLogConsumer(new Slf4jLogConsumer(logger))并使用try-with-resources关闭它。
由于关闭.withLogConsumer(new Slf4jLogConsumer(logger))返回的对象也会关闭MySQLContainerit is the same objects as it returns this,因此这是一个误报。
如果你想绕过这个错误而不想隐藏它,你可以尝试关闭这两个资源(这正是IntelliJ想要你做的):

try (
                var containerWithoutLogger = new MySQLContainer<>("mysql:8.0");
                var mySQLContainer = containerWithoutLogger.withLogConsumer(new Slf4jLogConsumer(logger))
        ) {
            mySQLContainer.start();
            assertThat(mySQLContainer.isRunning(), is(true));
        }

然而,这会关闭它两次。或者,你可以尝试在try块中调用withLogConsumer,但这可能会导致在那一点上显示类似的警告。

try (
                var mySQLContainer = new MySQLContainer<>("mysql:8.0");
        ) {
            mySQLContainer.withLogConsumer(new Slf4jLogConsumer(logger));
            mySQLContainer.start();
            assertThat(mySQLContainer.isRunning(), is(true));
        }

相关问题