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

6kkfgxo0  于 2023-01-29  发布在  Spring
关注(0)|答案(6)|浏览(252)

我正在构建一个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,我无法连接,但一旦我开始测试之后,我可以连接)。
无论如何,如果我从网络浏览器打开我的H2控制台,没有模式显示在它。
非常感谢!!

lf5gs5x2

lf5gs5x21#

由于这可能是一个测试调试特性,您可以在运行时使用**@Before**:

import org.h2.tools.Server;

/* Initialization logic here */

@BeforeAll
public void initTest() throws SQLException {
    Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082")
    .start();
}

然后连接到http://本地主机:8082/
注意:除非您需要将此代码作为CI构建的一部分运行,否则您需要在完成调试后删除此代码

ndasle7k

ndasle7k2#

下面是另一种方法,供将来参考:
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)
1.将代码中测试的数据库url设置为jdbc:h2:tcp://localhost:9092/mem:mytest
1.运行或调试测试。
1.在步骤1中打开的浏览器窗口中单击Connect
H2的Jar文件可在https://mvnrepository.com/artifact/com.h2database/h2下载。
服务器可以通过测试文件中的@Before启动,就像snovelli的回答一样,但只有在与数据库建立连接的情况下,这可能是一个问题。

lyr7nygr

lyr7nygr3#

我猜问题是你直接从你的应用程序连接到h2 db,而不是通过你用bean启动的服务器,因此你的应用程序和h2 db-web-interface不能共享一个内存数据库。
您应该在测试中将jdbcUrl更改为类似jdbc:h2:tcp://localhost/mem:my_DB;DB_CLOSE_DELAY=-1;MODE=Oracle的内容,并在浏览器中连接到相同的URL。
使用像jdbc:h2:tcp://localhost/...这样的jdbc url,所有的连接都将通过h2 db-server,你可以在浏览器中查看数据库状态。

jqjz2hbq

jqjz2hbq4#

如果你在属性中定义了jdbc url,比如jdbc:h2:mem:db,那么当数据库被创建时,它实际上会得到一个更长的名字。
向测试类添加@Autowired DataSource dataSource,在某处设置调试点,然后使用dataSource.getConnection()检查该数据源并查看url属性。
日本数据库:氢2:分子量:43 ed 83 d 6 - 97 a1 -4515-a925-a8 ba 53 cd 322 c
把它插到网络控制台上就能看到我所期待的一切。
这不是最直接的方法,但确实有效。

0s7z1bwu

0s7z1bwu5#

@snovelli上面的回答很好。要在IDE中调试特定的测试用例,请在测试用例的末尾添加一个无限循环,然后转到浏览器并启动控制台,您可以查询数据。

import org.h2.tools.Server;

/* Initialization logic here */

@BeforeAll
public void initTest() throws SQLException {
    Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082")
    .start();
}

@Test
void testMyDBOperation() {
    //some db operations like save and get
    while(true) {
    }
}

现在您可以进入浏览器并在http://localhost:8082启动控制台。当然,调试后删除以上两个更改

cetgtptt

cetgtptt6#

这不是答案,而是一个调试技巧。
当您最终访问h2-conole http://127.0.0.1:8082/时,您可能会注意到数据库更改没有显示。
这是因为测试用例不是事务性的,并且数据未提交。虽然此行为很好,但由于每个测试用例都必须在预定义的环境中运行,因此如果要调试并查看数据库更改,则不太好。
要实现这一点,请在测试用例上方添加@Commit注解,并在带@AfterAll注解的方法中放置一个虚拟行,以停止测试并让您看到h2控制台(h2服务器将在测试完成时停止)。

@AfterAll
public static void finalizeTest() throws Exception  {
    System.out.print("Just put a break point here");
}  

@Test
@Commit
void should_store_an_article() {        
 // Your test here
}

相关问题