H2 数据库在 SpringBoot 测试用例中不起作用

问题描述 投票:0回答:1

我在 SpringBoot 应用程序中有以下测试用例,并带有提到的数据源配置

@DataJpaTest
@ComponentScan(#service package)
@ContextConfiguration(classes = DataSourceConfiguration.class)
public class IdTest{

    @Autowired
    private EntityManager entityManager;
    @Autowired
    private MyRespository myRepository;
    @Autowired
    private ProcessorService processorService;
    @Autowired
    private DataSource dataSource;
    @Autowired
    private JdbcTemplate jdbcTemplate;

    MyObject myObject;

    @Test
    void injectedComponentsAreNotNull() {
        assertNotNull(dataSource);
        assertNotNull(jdbcTemplate);
        assertNotNull(entityManager);
        assertNotNull(myRepository);
    }

    @Test
    @Transactional
    public void invalidId() throws Exception {
        String resource = "/invalid/invalidId.xml";
        myObject= new MyObject();
        modifyPrivateField(myObject, "id", readFileToByteArray(resource));
        modifyPrivateField(myObject, "name", resource);

        MyObject mySavedObject = myRepository.save(myObject);
        ProcessingResult rsult = processorService.process(mySavedObject.getId());
        assertNotNull(rsult);
        assertEquals(ProcessingResult.ErrorCode.ILLEGAL_FORMAT_MANDATE_ID, rsult.getErrorCode());
        assertEquals(1, rsult.getVars().length);
        assertEquals("3805213", rsult.getVars()[0]);
    }

}

DataSourceConfiguration.java

@Configuration
@EnableJpaRepositories(basePackages = {
        "#service package" }, entityManagerFactoryRef = "DataSourceEntityManagerFactory", transactionManagerRef = "transactionManager")
public class DataSourceConfiguration {

    @Value("${my.driverClassName}")
    private String driver;

    @Value("${my.url}")
    private String url;

    @Value("${my.username}")
    private String username;

    @Value("${my.password}")
    private String password;

    @Value("${my.dialect}")
    private String dialect;

    @Bean
    public DataSource unittestDataSource() {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName(driver);
        dataSourceBuilder.url(url);
        dataSourceBuilder.username(username);
        dataSourceBuilder.password(password);
        return dataSourceBuilder.build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean DataSourceEntityManagerFactory(
            @Qualifier("unittestDataSource") DataSource datasource) {
        EntityManagerFactoryBuilder builder = new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(),
                new HashMap(), null);
        Builder factoryBuilder = builder.dataSource(datasource);
        factoryBuilder.packages("#service package");
        factoryBuilder.persistenceUnit("PU-unittest");
        factoryBuilder.jta(false);

        Map<String, String> additionalProperties = new HashMap<>();
        additionalProperties.put("hibernate.dialect", dialect);
        factoryBuilder.properties(additionalProperties);

        return factoryBuilder.build();
    }
}

application.yml

my:
 dialect: org.hibernate.dialect.Oracle10gDialect
 driverClassName: org.h2.Driver
 url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=ORACLE;DATABASE_TO_UPPER=false
 username: sa
 password:

spring:
 jpa: 
  hibernate:
   ddl-auto: create-drop

当我配置oracle数据库时,测试用例执行没有任何错误。但是,当我配置 H2 数据库(如上所述)时,我收到错误

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "select PAS_CIO_SEQ1.nextval from[*] dual"; expected "identifier"; SQL statement: select PAS_CIO_SEQ1.nextval from dual [42001-200]

我在这里缺少什么?如何解决这个问题?

注意:我尝试过多种方言(Oracle、Oracle10g、h2 等)。

spring-boot unit-testing h2
1个回答
0
投票

我想说的是序列丢失了。验证它是否已创建,并尝试不使用

DATABASE_TO_UPPER=false
,以防 nextval 列的大小写出现问题...

© www.soinside.com 2019 - 2024. All rights reserved.