db2 Sping Boot 测试H2数据库导致ClassCastException

ezykj2lf  于 2023-10-18  发布在  DB2
关注(0)|答案(1)|浏览(186)

我在测试我的一个服务时收到这个ClassCastException:

  1. java.lang.ClassCastException: class java.math.BigInteger cannot be cast to class java.lang.Integer (java.math.BigInteger and java.lang.Integer are in module java.base of loader 'bootstrap')

在该服务中有多个createNativeQuery-count,如下所示:

  1. Query queryCount = em.createNativeQuery(sqlCount);
  2. return (Integer)queryCount.getSingleResult();

当我修复了castception到那个:

  1. return ((BigInteger)queryCount.getSingleResult()).intValue();

然后测试是成功的,但可悲的是,当我启动应用程序并调用“真实的”Db2数据库的服务时,我得到了一个ClassCastException。在这种情况下,BigInteger不能转换为Integer。
application-h2test.properties:

  1. spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.DB2Dialect

Config

  1. @Configuration
  2. @EnableTransactionManagement
  3. public class SomethingConfig {
  4. //...
  5. @Bean
  6. @Profile("h2test")
  7. @ConfigurationProperties(prefix = "spring.datasource")
  8. DataSource h2DataSource() {
  9. DriverManagerDataSource dataSource = new DriverManagerDataSource();
  10. dataSource.setDriverClassName("org.h2.Driver");
  11. dataSource.setUrl(
  12. "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=DB2");
  13. dataSource.setUsername("sa");
  14. dataSource.setPassword("");
  15. return dataSource;
  16. }
  17. //...
  18. }

SomethingServiceTest

  1. @ActiveProfiles("h2test")
  2. @SpringBootTest
  3. class SomethingServiceTest {
  4. @Autowired
  5. SomethingService sut;
  6. @Test
  7. void givenYWhenXThenZ() {
  8. this.sut.getSomething(); //In the Implementation the ClassCastException is thrown
  9. }
  10. }

data.sql

  1. SET MODE DB2;

我尝试了几种方法,例如,我改变了应用程序属性或配置中的方言(DB2390、DB2400)和模式。
我目前想到的唯一解决方案是,我可以捕获ClassCastException,当Exception发生时,我将它转换为Biginteger,以便测试成功。
但是,我不喜欢在测试成功的服务中实现逻辑。你有别的方法/想法吗?

qmb5sa22

qmb5sa221#

((Number)queryCount.getSingleResult()).intValue();应该做的工作。

相关问题