我一直在抱怨,我必须用眼睛检查hibernate查询,而不需要自动化。这就是为什么我被vladmihalcea称为db-util的图书馆迷住了。
但问题是。我不能用它的方法。我用Kotlin Spring Boot。下面是密码。
实体
@Entity
class Book(
@Id
@GeneratedValue(strategy = IDENTITY)
val id: Long = 0L,
)存储库
interface BookRepository : JpaRepository<Book, Long>服务
@Service
class DemoService(
private val bookRepository: BookRepository,
) {
@Transactional
fun a() {
bookRepository.findById(0)
}
}最后,测试代码
@SpringBootTest
@TestConstructor(autowireMode = ALL)
internal class DemoServiceTest(
private val demoService: DemoService,
) {
@Test
fun a() {
reset()
demoService.a()
assertSelectCount(1)
}
}这个测试给了我一个失败的结果,下面的消息如下:
Expected 1 statements but recorded 0 instead!
com.vladmihalcea.sql.exception.SQLSelectCountMismatchException: Expected 1 statements but recorded 0 instead!我不明白的是,所测试的服务方法a()是事务性方法,但assertSelectCount()方法没有检测到已执行的查询。
以下是日志:
[ Test worker] org.hibernate.SQL : select book0_.id as id1_0_0_ from book book0_ where book0_.id=?
[ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [0]你能帮帮我吗?提前谢谢。
发布于 2022-09-02 06:46:30
我错过的是数据代理。
下面的代码需要通过测试方法a()。我找到了这个这里。
@Component
class DatasourceProxyBeanPostProcessor : BeanPostProcessor {
override fun postProcessBeforeInitialization(bean: Any, beanName: String): Any {
return bean
}
override fun postProcessAfterInitialization(bean: Any, beanName: String): Any {
return if (bean is DataSource) {
ProxyDataSourceBuilder.create(bean)
.logQueryBySlf4j(INFO)
.multiline()
.countQuery()
.build()
} else bean
}
}发布于 2022-10-03 15:24:45
我在Spring中发现了vladmihalcea的db-util在github项目Ancarian/工厂中的工作集成。添加此组件将所需侦听器添加到Junit Test:DatasourceProxyBeanPostProcessor.java中使用的数据源
https://stackoverflow.com/questions/73532597
复制相似问题