在Spring应用程序中运行junit测试时访问h2 web控制台

在Spring应用程序中运行junit测试时访问h2 web控制台,spring,junit,h2,Spring,Junit,H2,我正在构建一个Spring应用程序,在从web浏览器运行JUnit测试时,我需要检查内存中的H2数据库 在我的Spring配置中,我有一个bean,负责创建我的数据库模式,并用一些数据填充它,这些数据将在我的JUnit测试中使用。我还在测试上下文中添加了一个bean,它创建了一个web服务器,我最终将在其中查找数据 <bean id="org.h2.tools.Server-WebServer" class="org.h2.tools.Server" factory-method=

我正在构建一个Spring应用程序,在从web浏览器运行JUnit测试时,我需要检查内存中的H2数据库

在我的Spring配置中,我有一个bean,负责创建我的数据库模式,并用一些数据填充它,这些数据将在我的JUnit测试中使用。我还在测试上下文中添加了一个bean,它创建了一个web服务器,我最终将在其中查找数据

<bean id="org.h2.tools.Server-WebServer" class="org.h2.tools.Server"
    factory-method="createWebServer" init-method="start" lazy-init="false">
    <constructor-arg value="-web,-webAllowOthers,-webPort,11111" />
</bean>

一切似乎都正常,因为数据库已正确填充,因为我可以从JUnit测试访问它的数据,H2服务器只在我处于测试阶段时运行(我可以知道,因为如果我在调试测试之前尝试访问我的ip:111111,我无法连接,但我可以在启动测试之后连接)

无论如何,如果我从web浏览器打开H2控制台,其中不会显示任何模式。有什么想法吗


非常感谢

我想问题是您直接从应用程序连接到h2db。不是通过使用bean启动的服务器。因此,您的应用程序和h2db web界面无法在内存数据库中共享一个

您应该将测试中的jdbcUrl更改为类似于
jdbc:h2:tcp://localhost/mem:my_DB;DB_CLOSE_DELAY=-1;MODE=Oracle
,在浏览器中,您应该连接到同一url


使用jdbc URL,如
jdbc:h2:tcp://localhost/...
所有连接都将通过h2db服务器,您可以在浏览器中查看数据库状态。

我想问题在于您直接从应用程序连接到h2db。不是通过使用bean启动的服务器。因此,您的应用程序和h2db web界面无法在内存数据库中共享一个

您应该将测试中的jdbcUrl更改为类似于
jdbc:h2:tcp://localhost/mem:my_DB;DB_CLOSE_DELAY=-1;MODE=Oracle
,在浏览器中,您应该连接到同一url


使用jdbc URL,如
jdbc:h2:tcp://localhost/...
所有连接都将通过h2db服务器,您可以在浏览器中查看数据库状态。

由于这可能是一项测试调试功能,您可以在运行时使用之前的@添加它:

import org.h2.tools.Server;

/* Initialization logic here */

@BeforeAll
public void initTest() throws SQLException {
    Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082")
    .start();
}
然后连接到http://localhost:8082/


注意:除非您需要将此代码作为CI构建的一部分运行,否则您需要在完成调试时删除此代码,因为这可能是一项测试调试功能,您可以在运行时使用@Before:

import org.h2.tools.Server;

/* Initialization logic here */

@BeforeAll
public void initTest() throws SQLException {
    Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082")
    .start();
}
然后连接到http://localhost:8082/


注意:除非您需要将此代码作为CI生成的一部分运行,否则您需要在完成调试后删除此代码,以供将来参考。以下是另一种方法:

  • 启动数据库和web服务器(版本可能不同):

    $cd…/maven_repository/com/h2database/h2/1.4.194
    $java-cp h2-1.4.194.jar org.h2.tools.Server-tcp-web-browser
    正在运行的TCP服务器tcp://169.254.104.55:9092 (仅本地连接)
    正在运行的Web控制台服务器http://169.254.104.55:8082 (仅本地连接)

  • 将代码中测试的数据库url设置为
    jdbc:h2:tcp://localhost:9092/mem:mytest

  • 运行或调试测试
  • 在步骤1中打开的浏览器窗口中单击连接
  • H2的Jar文件可在下载


    服务器可以通过测试文件中的
    @Before
    启动,就像snovelli的回答一样,但只有在之后建立了与数据库的连接时,这可能会出现问题。

    为供将来参考,这里有另一种方法:

  • 启动数据库和web服务器(版本可能不同):

    $cd…/maven_repository/com/h2database/h2/1.4.194
    $java-cp h2-1.4.194.jar org.h2.tools.Server-tcp-web-browser
    正在运行的TCP服务器tcp://169.254.104.55:9092 (仅本地连接)
    正在运行的Web控制台服务器http://169.254.104.55:8082 (仅本地连接)

  • 将代码中测试的数据库url设置为
    jdbc:h2:tcp://localhost:9092/mem:mytest

  • 运行或调试测试
  • 在步骤1中打开的浏览器窗口中单击连接
  • H2的Jar文件可在下载


    服务器可以像snovelli的回答一样通过测试文件中的
    @在之前启动,但只有在之后建立了与数据库的连接的情况下,这可能是个问题。

    单元测试中的jdbcUrl是什么样子的?嗨,Michael,谢谢你的回答。我的jdbc URL看起来像jdbc:h2:mem:My_DB;DB_CLOSE_DELAY=-1;MODE=Oracle我还尝试在jdbc URL中添加IFEXIST属性,以防对我有所帮助。它不能:(你好@Ivan Fernandez,你能告诉我们你是如何解决这个问题的吗?我面临着同样的问题。非常感谢你的回答。谢谢!!你能解决这个问题吗?你在单元测试中的jdbcUrl是什么样子的?嗨,Michael,谢谢你的回答。我的jdbc URL看起来像jdbc:h2:mem:My_DB;DB_CLOSE_DELAY=-1;MODE=Oracle I'我还尝试在jdbc URL中添加IFEXIST属性,以防对我有所帮助。它无法:(你好@Ivan Fernandez你能告诉我们你是如何解决这个问题的吗?我也面临着同样的问题。非常感谢你的回答。谢谢!!你能解决这个问题吗?如果你没有提供连接URL,那么你可以使用默认URL jdbc:h2:mem:datasource从控制台连接到h2 db它最好在上课前使用我们可以使用web控制台在内存h2 DB中观察“jdbc:h2:mem:test”吗?如果您没有提供连接URL,那么您可以使用默认URL jdbc:h2:mem:datasource从控制台连接到h2 DB。它最好使用BeforeClass而不是BeforeClass。我们可以使用web控制台在内存h2 DB中观察“jdbc:h2:mem:test”吗?