我一直在抱怨我必須在沒有自動化的情況下用眼睛檢查休眠查詢。這就是為什么我對 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]
請你幫助我好嗎?提前致謝。
uj5u.com熱心網友回復:
這是我錯過的資料代理。
下面的代碼需要通過測驗方法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
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/504461.html
