我有以下内容:
@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
)
如果将中@Before
的when(sessionFactory.getCurrentSession()).thenReturn(session)
更改为doReturn(session).when(sessionFactory).getCurrentSession()
什么是正确的配置?
在setup()
方法中,您可以正确地告诉Mockitosession
在sessionFactory.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] 删除。
我来说两句