我在测试我的一个服务时收到这个ClassCastException:
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,如下所示:
Query queryCount = em.createNativeQuery(sqlCount);
return (Integer)queryCount.getSingleResult();
当我修复了castception到那个:
return ((BigInteger)queryCount.getSingleResult()).intValue();
然后测试是成功的,但可悲的是,当我启动应用程序并调用“真实的”Db2数据库的服务时,我得到了一个ClassCastException。在这种情况下,BigInteger不能转换为Integer。
application-h2test.properties:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.DB2Dialect
Config
@Configuration
@EnableTransactionManagement
public class SomethingConfig {
//...
@Bean
@Profile("h2test")
@ConfigurationProperties(prefix = "spring.datasource")
DataSource h2DataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl(
"jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=DB2");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}
//...
}
SomethingServiceTest
@ActiveProfiles("h2test")
@SpringBootTest
class SomethingServiceTest {
@Autowired
SomethingService sut;
@Test
void givenYWhenXThenZ() {
this.sut.getSomething(); //In the Implementation the ClassCastException is thrown
}
}
data.sql
SET MODE DB2;
我尝试了几种方法,例如,我改变了应用程序属性或配置中的方言(DB2390、DB2400)和模式。
我目前想到的唯一解决方案是,我可以捕获ClassCastException,当Exception发生时,我将它转换为Biginteger,以便测试成功。
但是,我不喜欢在测试成功的服务中实现逻辑。你有别的方法/想法吗?
1条答案
按热度按时间qmb5sa221#
((Number)queryCount.getSingleResult()).intValue();
应该做的工作。