[英]Mockito argument matcher and hibernate lazyinitialization
我創建了以下捕獲程序:
public class CompanyOwnerMatcher extends ArgumentMatcher<CompanyOwner> {
private String uuid;
CompanyOwnerMatcher(String uuid) {
this.uuid = uuid;
}
@Override
public boolean matches(Object arg) {
if (!(arg instanceof CompanyOwner)) return false;
CompanyOwner owner = (CompanyOwner) arg;
return Objects.equals(uuid, owner.getUuid());
}
}
我在此代碼中出現異常:
Mockito.verify(payInApi).submit(eq(1L), argThat(new CompanyOwnerMatcher(expectedOwnerUuid)));
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:148)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:266)
CompanyOwner
由休眠管理。 這很奇怪,但是當我抓住CompanyOwner
,就無法獲得任何字段值,因為即使在未標記為Lazy的字段上也會得到LazyInitializationException
。
希望對這個問題有任何幫助。
謝謝!
我相信,Hibernate創建了CompanyOwner
某種代理。 然后,它實際上取決於代碼,很可能在您調用匹配器時,該對象已經與Hibernate Session分離。 在這種情況下,當您嘗試訪問如上所述的字段時,將獲得LazyInitializationException
。
從提供的代碼中完全無法理解,為什么休眠完全決定使用代理包裝對象,我只能建議在matches
方法中放置一個斷點,以確保這確實是代理,但是您必須弄清楚列出制作此代理的原因。
如果您看到確實必須在這種情況下完成代理,則最好的辦法是將對象“重新附加”到會話。 異常應該消失了,但是在這種情況下,您可能會看到休眠發出數據庫請求。
您可能也對此線程感興趣
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.