Mockito参数匹配器和休眠延迟初始化

时间:2019-08-06 09:47:32

标签: java junit mockito spring-test

我创建了以下捕获程序:

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,因此无法获得任何字段值。

在此问题上的任何帮助将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

我相信,Hibernate创建了CompanyOwner的某种代理。 然后,它实际上取决于代码,很可能在您调用匹配器时,该对象已经与Hibernate Session分离。 在这种情况下,尝试访问您提到的字段时,您会得到LazyInitializationException

从提供的代码片段中完全无法理解为什么休眠模式确切决定使用代理包装对象,我只能建议在matches方法中放置一个断点以确保这确实是代理,但是那么您就必须找出制作此代理的原因。

如果在这种情况下确实必须执行代理,则最好的办法是将对象“重新附加”到会话。异常应该消失了,但是在这种情况下,您可能会看到休眠状态发出数据库请求。

您可能还对This thread

感兴趣