正确配置以模拟Hibernate的sessionFactory.getCurrentSession()

曼努埃尔·乔丹(Manuel Jordan)

我有以下内容:

@Repository
@Transactional
@HibernateProfile
public class PersonaHibernateRepository implements PersonaRepository {

    private static final Logger logger = LoggerFactory.getLogger(PersonaHibernateRepository.class.getSimpleName());

    private final SessionFactory sessionFactory;

    public PersonaHibernateRepository(SessionFactory sessionFactory){
        logger.info("{} constructor", PersonaHibernateRepository.class.getSimpleName());
        this.sessionFactory = sessionFactory;
    }

    @Override
    public Persona saveOne(Persona persona) {
        String generatedIdentifier = (String) sessionFactory.getCurrentSession().save(persona);
        logger.info("generatedIdentifier: {}", generatedIdentifier);
        return persona;
    }

...

每种crud方法都有sessionFactory.getCurrentSession()

Mockito下面的句子:

when(sessionFactory.getCurrentSession().save(persona)).thenReturn(persona.getId());

总是抛出java.lang.NullPointerException我已经确认sessionFactory.getCurrentSession()是问题所在。

我已经阅读以下内容:

因此,将java.lang.NullPointerException其删除。

但我现在总是明白:

org.mockito.exceptions.verification.TooManyActualInvocations: 
sessionFactory.getCurrentSession();
Wanted 1 time:
-> at com.manuel.jordan.repository.hibernate.PersonaHibernateRepositoryTest_.saveOneTest(PersonaHibernateRepositoryTest_.java:76)
But was 2 times. Undesired invocation:
-> at com.manuel.jordan.repository.hibernate.PersonaHibernateRepository.saveOne(PersonaHibernateRepository.java:43)

这两次是由于模拟调用和目标调用而发生的。

目前,我的配置是:

private PersonaHibernateRepository personaHibernateRepository;
private SessionFactory sessionFactory;
private Session session;

...

@Before
public void setup(){
    sessionFactory = mock(SessionFactory.class);
    session = mock(Session.class);
    personaHibernateRepository = new PersonaHibernateRepository(sessionFactory);
    //Removes NullPointerException - 'A'
    when(sessionFactory.getCurrentSession()).thenReturn(session);
}

@Test
public void saveOneTest(){

    //java.lang.NullPointerException removed thanks to 'A'      
    when(sessionFactory.getCurrentSession().save(persona)).thenReturn(persona.getId());

    Persona persona_ = personaHibernateRepository.saveOne(persona);
    assertThat(persona_, is(persona));

    //B
    verify(sessionFactory).getCurrentSession().save(persona);
}

只是在玩,如果我改变了:

从: verify(sessionFactory).getCurrentSession().save(persona);

至:(verify(sessionFactory, times(2)).getCurrentSession().save(persona);观察times(2)

再次出现的java.lang.NullPointerException抛出,现在verify(sessionFactory, times(2)).getCurrentSession().save(persona);B

如果将中@Beforewhen(sessionFactory.getCurrentSession()).thenReturn(session)更改为doReturn(session).when(sessionFactory).getCurrentSession()

什么是正确的配置?

涂鸦

setup()方法中,您可以正确地告诉MockitosessionsessionFactory.getCurrentSession()调用返回模拟的实例,因此从它们出发的断言应集中在session实例上,而不是在上sessionFactory例如:

@Test
public void saveOneTest(){
    // you have already told Mockito to return this session instance when sessionFactory.getCurrentSession() is 
    // invoked so now your when (and optionally verify) should focus on session rather than on sessionFactory
    when(session.save(persona)).thenReturn(persona.getId());

    Persona persona_ = personaHibernateRepository.saveOne(persona);
    assertThat(persona_, is(persona));

    verify(session).save(persona);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Hibernate OpenSession()与GetCurrentSession()

NoSuchMethodError:org.hibernate.SessionFactory.getCurrentSession()

Spring + Hibernate:sessionFactory.getCurrentSession()导致NullPointerException

Hibernate的Sessionfactory.getCurrentSession()和SessionFactory.openSession()的区别

在Hibernate中使用SessionFactory.getCurrentSession()时获取Connection对象

未为类型SessionFactory定义方法getCurrentSession()

休眠:sessionFactory.openSession()VS sessionFactory.getCurrentSession()

Hibernate在Transaction内使用openConnection,在Transaction外使用getCurrentSession

使用_sessionFactory.getCurrentSession()检索用户会话中的当前用户ID。冬眠的

休眠openSession()vs getCurrentSession()

何时使用OpenSession()和GetCurrentSession()

getCurrentSession()-NullPointerException-为什么?

Hibernate + Spring SessionFactory配置

java.lang.NullPointerException session.getCurrentSession()

在getCurrentSession()上使用openSession()-何时以及为什么?

Hibernate sessionFactory的程序化配置需要“ sessionFactory”或“ hibernateTemplate”

Hibernate 3 sessionFactory在Spring Java配置中

session.getCurrentSession()。createCriteria(MyClass.class)不建议立即使用.addOrder()

sessionfactory 在基于 Spring hibernate xml 的配置中总是返回 null

Hibernate SessionFactory与Spring LocalSessionFactoryBean

Hibernate SessionFactory与JPA EntityManagerFactory

为什么在Spring-Hibernate Configuration中同时配置dataSource和sessionFactory?

Spring 3.1,Hibernate 4,SessionFactory

使用hibernate sessionFactory还是JPAEntityManager?

Hibernate SessionFactory,动态设置TransactionIsolationLevel

Hibernate初始SessionFactory创建失败

获取文件路径-Hibernate SessionFactory

在Spring中配置JPA的SessionFactory

使用Spring + Hibernate进行多租户:“为多租户配置了SessionFactory,但未指定租户标识符”