在JUnit5测试类之间共享application.properties的数据库连接

p4tfgftt  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(486)

我有几个junit类到不同的测试包中。我想用 application.properties spring框架用来建立数据库连接的文件。
问题是如何使用中的属性创建数据库连接 application.properties 当第一个junit测试运行并对所有类重用它时。在末端正确关闭连接。
我尝试了这个解决方案:https://www.testcontainers.org/test_framework_integration/manual_lifecycle_control/

abstract class AbstractContainerBaseTest {

    static final MSSQLServerContainer CONTAINER;

    static {
        CONTAINER = new MSSQLServerContainer();
        CONTAINER.start();
    }
}

public class TestResultLoggerExtension extends AbstractContainerBaseTest implements TestWatcher, AfterAllCallback {

    .......

    @Override
    public void afterAll(ExtensionContext extensionContext) throws Exception {

        CONTAINER.getJdbcUrl();

        System.out.println("!!!! afterAll");
    }
}

但我有个例外:

java.lang.ExceptionInInitializerError
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:64)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
    at org.junit.platform.commons.util.ReflectionUtils.newInstance(ReflectionUtils.java:511)
    at org.junit.platform.commons.util.ReflectionUtils.newInstance(ReflectionUtils.java:486)
    at org.junit.jupiter.engine.extension.MutableExtensionRegistry.registerExtension(MutableExtensionRegistry.java:176)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at org.junit.jupiter.engine.extension.MutableExtensionRegistry.createRegistryFrom(MutableExtensionRegistry.java:117)
    at org.junit.jupiter.engine.descriptor.ExtensionUtils.populateNewExtensionRegistryFromExtendWithAnnotation(ExtensionUtils.java:77)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.prepare(ClassBasedTestDescriptor.java:143)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.prepare(ClassBasedTestDescriptor.java:78)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$1(NodeTestTask.java:107)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:107)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:75)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248)
    at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211)
    at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)
    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
Caused by: org.testcontainers.containers.ContainerLaunchException: Container startup failed
    at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:327)
    at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:308)
    at org.poc.AbstractContainerBaseTest.<clinit>(AbstractContainerBaseTest.java:11)
    ... 39 more
Caused by: org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=mcr.microsoft.com/mssql/server:2017-CU12, imagePullPolicy=DefaultPullPolicy())
    at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1278)
    at org.testcontainers.containers.MSSQLServerContainer.configure(MSSQLServerContainer.java:71)
    at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:313)
    ... 41 more
Caused by: java.lang.IllegalStateException: Could not find a valid Docker environment. Please see logs and check configuration
    at org.testcontainers.dockerclient.DockerClientProviderStrategy.lambda$getFirstValidStrategy$7(DockerClientProviderStrategy.java:214)
    at java.base/java.util.Optional.orElseThrow(Optional.java:401)
    at org.testcontainers.dockerclient.DockerClientProviderStrategy.getFirstValidStrategy(DockerClientProviderStrategy.java:206)
    at org.testcontainers.DockerClientFactory.getOrInitializeStrategy(DockerClientFactory.java:134)
    at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:176)
    at org.testcontainers.LazyDockerClient.getDockerClient(LazyDockerClient.java:14)
    at org.testcontainers.LazyDockerClient.listImagesCmd(LazyDockerClient.java:12)
    at org.testcontainers.images.LocalImagesCache.maybeInitCache(LocalImagesCache.java:68)
    at org.testcontainers.images.LocalImagesCache.get(LocalImagesCache.java:32)
    at org.testcontainers.images.AbstractImagePullPolicy.shouldPull(AbstractImagePullPolicy.java:18)
    at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:66)
    at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:27)
    at org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:17)
    at org.testcontainers.utility.LazyFuture.get(LazyFuture.java:39)
    at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1276)
    ... 43 more

17:58:36.765 [main] DEBUG org.testcontainers.utility.TestcontainersConfiguration - Testcontainers configuration overrides will be loaded from file:/C:/Users/plte1219/.testcontainers.properties
17:58:36.783 [main] WARN org.testcontainers.utility.TestcontainersConfiguration - Attempted to read Testcontainers configuration file at file:/C:/Users/plte1219/.testcontainers.properties but the file was not found. Exception message: FileNotFoundException: C:\Users\plte1219\.testcontainers.properties (The system cannot find the file specified)
17:58:36.787 [main] INFO org.testcontainers.utility.ImageNameSubstitutor - Image name substitution will be performed by: DefaultImageNameSubstitutor (ConfigurationFileImageNameSubstitutor)
17:58:36.796 [main] DEBUG org.testcontainers.utility.ImageNameSubstitutor - Did not find a substitute image for mcr.microsoft.com/mssql/server:2017-CU12 (using image substitutor: DefaultImageNameSubstitutor (ConfigurationFileImageNameSubstitutor))
17:58:36.819 [main] INFO org.testcontainers.dockerclient.DockerMachineClientProviderStrategy - docker-machine executable was not found on PATH ([C:\Windows\system32, C:\Windows, C:\Windows\System32\Wbem, C:\Windows\System32\WindowsPowerShell\v1.0\, C:\Windows\System32\OpenSSH\, C:\Program Files\Git\cmd, C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\, C:\Program Files (x86)\Microsoft SQL Server\150\Tools\Binn\, C:\Program Files\Microsoft SQL Server\150\Tools\Binn\, C:\Program Files\Microsoft SQL Server\150\DTS\Binn\, C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Binn\, C:\Program Files\Azure Data Studio\bin, C:\Users\plte1219\AppData\Local\Microsoft\WindowsApps, , C:\Program Files\Azure Data Studio\bin])
17:58:37.231 [ducttape-0] DEBUG org.testcontainers.dockerclient.DockerClientProviderStrategy - Pinging docker daemon...
17:58:37.253 [ducttape-0] DEBUG org.testcontainers.shaded.com.github.dockerjava.core.command.AbstrDockerCmd - Cmd: 
17:58:47.380 [ducttape-0] DEBUG org.testcontainers.dockerclient.DockerClientProviderStrategy - Pinging docker daemon...
17:58:47.380 [ducttape-0] DEBUG org.testcontainers.shaded.com.github.dockerjava.core.command.AbstrDockerCmd - Cmd: 
17:58:57.492 [ducttape-0] DEBUG org.testcontainers.dockerclient.DockerClientProviderStrategy - Pinging docker daemon...
17:58:57.492 [ducttape-0] DEBUG org.testcontainers.shaded.com.github.dockerjava.core.command.AbstrDockerCmd - Cmd: 
17:59:07.238 [main] DEBUG org.testcontainers.dockerclient.DockerClientProviderStrategy - NpipeSocketClientProviderStrategy: failed with exception TimeoutException (Timeout waiting for result with exception). Root cause NoSuchFileException (\\.\pipe\docker_engine)
17:59:07.238 [main] ERROR org.testcontainers.dockerclient.DockerClientProviderStrategy - Could not find a valid Docker environment. Please check configuration. Attempted configurations were:
17:59:07.238 [main] ERROR org.testcontainers.dockerclient.DockerClientProviderStrategy -     NpipeSocketClientProviderStrategy: failed with exception TimeoutException (Timeout waiting for result with exception). Root cause NoSuchFileException (\\.\pipe\docker_engine)
17:59:07.239 [main] ERROR org.testcontainers.dockerclient.DockerClientProviderStrategy - As no valid configuration was found, execution cannot continue
17:59:07.239 [main] DEBUG org.testcontainers.utility.ImageNameSubstitutor - Did not find a substitute image for mcr.microsoft.com/mssql/server:2017-CU12 (using image substitutor: DefaultImageNameSubstitutor (ConfigurationFileImageNameSubstitutor))

你知道我怎么解决这个问题吗?

uz75evzq

uz75evzq1#

你可以用 SpringBootTest 或者 DataJpaTest 以及特定于测试的spring概要文件,并让spring测试上下文处理数据库连接。例如,使用 test 你可以用一个 src/test/resources/application-test.properties 文件。
您还可以查看testcontainers jdbc文档,以获取有关通过jdbcurlscheme启动的数据库容器的信息,这是为测试启动数据库容器的最简单方法。
你也可以以这个答案为例。

相关问题