junit 如何使用在测试中创建的bean来运行应用程序?

deyfvvtc  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(120)

我正在为一个应用程序编写测试,在该应用程序中,当连接到DB2数据库时,DataSource被创建为Bean。对于测试,我希望使用内存中的H2数据库并调用main方法来运行应用程序。我已经在test文件夹中为Datasource和H2数据库创建了一个bean。但是,当我调用main方法时,控件总是转到原始应用程序,并且始终创建带有DB2数据库的Bean。如何在应用程序中使用带有H2数据库的bean?我在测试中编写的config类永远不会被调用,因此带H2 Database的bean永远不会被创建。
我在测试文件夹中有一个config类,它将在稍后的测试文件中导入。

@TestConfiguration
@AutoConfiguration
public class H2Test {

@Primary
@Bean
@ConditionalOnMissingBean

public Datasource getH2bean() {
JdbcDataSource jdbcDataSource=new JdbcDataSource();
jdbcDataSource.setURL(<<Url to the H2 in-memory Database>>);
//further code
return jdbcDataSource;
}
}

我希望在运行完整的应用程序时使用上面的bean(getH2bean),因为我想调用应用程序的main方法。
我调用main方法的测试文件如下所示-

@SpringBootTest(classes={H2Test.class})
@ContectConfiguration(classes ={H2Test.class})
public class mainTest{

@Test
public void testMain() throws Exception{

A a=new A();
Assertions.assertDoesNotThrow(()-> a.main());
//call the main method of the application here
}
}

在这种情况下,如何在原始应用程序中使用getH2bean()

rbl8hiat

rbl8hiat1#

看来您还没有为应用程序的开发和测试设置维护单独的配置。这基本上是保持专用Spring轮廓。
在spring-boot中,您可以创建一个application.properties,其中包含实际数据库的数据库配置,比如说postgre sql

spring.datasource.url= jdbc:postgresql://localhost:5432/testdb
spring.datasource.username= postgres
spring.datasource.password= dummypwd
# some more postgres specific properties

和包含H2数据库配置的application-test.properties

spring.datasource.url=jdbc:h2:file:./testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
 
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto= update
# some more H2 specific properties

然后在Test类中,可以使用@ActiveProfiles(value = "test")注解来激活相应的概要文件,并加载与之关联的配置。
有关详细信息,请参见ActiveProfiles
Eg

@SpringBootTest(classes={H2Test.class})
@ContectConfiguration(classes ={H2Test.class})
@ActiveProfiles(value = "test")
public class mainTest{

@Test
public void testMain() throws Exception{

A a=new A();
Assertions.assertDoesNotThrow(()-> a.main());
//call the main method of the application here
}
}

请注意:您可能需要将mainTest类中的第一行重构为@SpringBootTest(classes = YourApplication.class),其中YourApplication.class是Spring-Boot应用程序的主类

相关问题