【发布时间】:2017-08-16 02:21:49
【问题描述】:
我有以下几点:
@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))
verify(sessionFactory, times(2)).getCurrentSession().save(persona); (B) now 再次出现java.lang.NullPointerException
如果在@Before 中将when(sessionFactory.getCurrentSession()).thenReturn(session) 更改为doReturn(session).when(sessionFactory).getCurrentSession(),则会出现同样的异常
什么是正确的配置?
【问题讨论】:
-
verify(sessionFactory).getCurrentSession().save(persona);应该是verify(sessionFactory.getCurrentSession()).save(persona);
标签: java unit-testing junit mockito