使用Spring测试数据库

时间:2018-08-13 12:06:34

标签: java spring testing spring-data

我需要在数据库(连接,关闭数据库..)错误期间对应用程序行为进行Spring测试。 是否可以通过Spring单元测试关闭/杀死或启动H2内存数据库?

3 个答案:

答案 0 :(得分:0)

在使用h2测试数据库运行Junit测试时,该数据库实例将在测试套件开始运行时启动,并在测试完成时停止(假设您已使用bean配置了数据库)。

如果您使用的是spring-boot,则可以像下面这样配置h2测试数据库:

src / test / resources / application-test.yml:

spring:
  datasource:
    driverClassName: org.h2.Driver
    url: jdbc:h2:mem:testdb
    username: sa
    password:

并按照以下方式配置测试:

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles(profiles = "test")
public class SignupControllerTest {
    @Autowired
    private WebApplicationContext webApplicationContext;

    private MockMvc mockMvc;

    @Autowired
    private RealityKeeperRepository myrepo;

如果您使用的是常规弹簧,则可以使用@Profile("test")注释配置DataSource bean:

@Bean
@Profile("test")
public DataSource devDataSource() {
    return new EmbeddedDatabaseBuilder()
        .setType(EmbeddedDatabaseType.HSQL)
        .build();
}

并配置测试,例如:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {AppConfig.class})
@ActiveProfiles(profiles = "test")
public class MyTest {
    @Autowired
    ...

您的AppConfig类应使用@Configuration注释,其中包含上述的devDataSource bean。

答案 1 :(得分:0)

是的,如果您具有H2依赖性并且没有设置,那么Spring boot将为您启动嵌入式H2 DB。

本文应该有用:http://www.springboottutorial.com/spring-boot-and-h2-in-memory-database

答案 2 :(得分:0)

如果测试数据库连接,这里是旧的,但仍然很好blog on the topic。您也应该能够使用 TestContainers,以便更简单地创建数据库。

如果您只需要在某些确切的操作(例如存储库保存)上测试一些失败,您可以简单地模拟存储库以进行测试运行:

var mockedBean = Mockito.mock(MyRepository.class);
var originalBean = ReflectionTestUtils.getField(articleService, fieldName);
Mockito.when(mockedBean.save(Mockito.any(MyEntity.class))).thenThrow(new RuntimeException("My test exception"));
ReflectionTestUtils.setField(myService, fieldName, mockedBean);
...
// test here
...
// set bean back for other test cases
ReflectionTestUtils.setField(myService, fieldName, originalBean);