私は、次のしている:HibernateのsessionFactory.getCurrentSessionを(モックへの正しい設定)
@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)
これらの2回は、モック呼び出しとターゲットの呼び出しにより起こります。
現在、私の設定は次のとおりです。
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
を表示されますnow by verify(sessionFactory, times(2)).getCurrentSession().save(persona);
(B
)
同じ例外@Before
にwhen(sessionFactory.getCurrentSession()).thenReturn(session)
は正しい構成で何doReturn(session).when(sessionFactory).getCurrentSession()
に変更された場合はどうなりますか? session
インスタンスではありませんsessionFactory
に焦点を当てるべきであるあなたが正しくsessionFactory.getCurrentSession()
があなたの主張にので、それらから呼び出されたときに嘲笑session
インスタンスを返すようにMockitoを伝えるsetup()
方法で
'(のSessionFactory).getCurrentSessionを()検証(ペルソナ)を保存;' '検証(sessionFactory.getCurrentSession())でなければなりません(ペルソナ)を保存します。あなたの提案が働く' – Chriss