27

我正在构建一个 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 服务器仅在我处于测试阶段时运行(我可以知道,因为如果我尝试访问 my_ip:111111在调试我的测试之前我无法连接,但一旦我开始测试我就可以连接)。

无论如何,如果我从 Web 浏览器打开我的 H2 控制台,则不会显示任何架构。有任何想法吗??

非常感谢!!

4

4 回答 4

38

由于这可能是一个测试调试功能,您可以在运行时使用@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 构建的一部分运行,否则您需要在完成调试后删除此代码

于 2015-12-03T14:35:31.660 回答
5

以供将来参考,这是另一种方法:

  1. 启动数据库和 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 server running at tcp://169.254.104.55:9092 (only local connections) Web Console server running at http://169.254.104.55:8082 (only local connections)

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

  3. 运行或调试测试。
  4. 在步骤 1 中打开的浏览器窗口中单击Connect

H2 的 Jar 文件可以在https://mvnrepository.com/artifact/com.h2database/h2下载。

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

于 2017-04-03T19:32:35.907 回答
2

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

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

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

于 2012-09-13T14:52:00.900 回答
0

如果您已在属性中将 jdbc url 定义为类似 jdbc:h2:mem:db 的内容,则在创建数据库时,它实际上会获得更长的名称。

将 @Autowired DataSource 数据源添加到您的测试类,在某处设置调试点,并使用 dataSource.getConnection() 检查该数据源并查看 url 属性。如果我此刻正在跑步,那就是

jdbc:h2:mem:43ed83d6-97a1-4515-a925-a8ba53cd322c

将其插入 web cosole 显示了我所期待的一切。

这不是最直接的方法,但确实有效。

于 2021-08-19T15:52:11.000 回答