簡體   English   中英

Mockito參數匹配器和休眠延遲初始化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM