Подход 1. Проверка кода Как есть
Метод getEntityManager
является закрытым и вызывает статический метод, поэтому при существующем состоянии вам потребуется использовать PowerMockito для обеспеченияподдельный экземпляр EntityManager
в вашем тесте.Например:
@RunWith(PowerMockRunner.class)
@PrepareForTest({EntityController.class})
public class SomeTest {
@Test
public void aTest() {
PowerMockito.mockStatic(EntityController.class);
EntityManager entityManager = Mockito.mock(EntityManager.class);
Mockito.when(EntityController.getEntityManager()).thenReturn(entityManager);
TypedQuery<ExamSkeleton> query = (TypedQuery<ExamSkeleton>) Mockito.mock(TypedQuery.class);
Mockito.when(entityManager.createQuery("SELECT NEW ExamSkeleton (s.id, s.filename, s.course, s.visible) FROM ExamSkeleton as s")).thenReturn(query);
List<ExamSkeleton> expected = new ArrayList<>();
Mockito.when(query.getResultList()).thenReturn(expected);
ExamRepository examRepository = new ExamRepository();
List<ExamSkeletons> actual = examRepository.getAllSkeletons();
// this assertion verifies that getAllSkeletons gives you the result of the above SQl query
assertSame(expected, actual);
}
}
Подход 2: Фактор для разделения проблем и простоты тестирования
Однако вы могли бы упростить вещи с точки зрения тестирования и проектирования, выполнив внешнее созданиеМенеджер сущностей на фабрике, например.
public class EntityManagerFactory {
public EntityManager create() {
return EntityController.getEntityManager();
}
}
Затем вставьте экземпляр EntityManagerFactory
в любой класс, содержащий getAllSkeletons()
(т. е. класс, который вы тестируете).Самый простой способ сделать это - объявить его в качестве аргумента конструктора:
public class SomeDao {
private final EntityManagerFactory entityManagerFactory;
public SomeDao(EntityManagerFactory entityManagerFactory) {
this.entityManagerFactory = entityManagerFactory;
}
@Override
public List<ExamSkeleton> getAllSkeletons() {
try {
TypedQuery<ExamSkeleton> query = entityManager.createQuery("SELECT NEW ExamSkeleton (s.id, s.filename, s.course, s.visible) FROM ExamSkeleton as s", ExamSkeleton.class);
List<ExamSkeleton> skeletons = query.getResultList();
return skeletons;
} catch (IllegalArgumentException exception) {
LOGGER.error(exception);
}
return Collections.emptyList();
}
}
Теперь вы можете протестировать этот код, используя vanilla mockito.Например:
public class SomeDaoTest {
@Test
public void canGetAllSkeletons() {
EntityManagerFactory entityManagerFactory = Mockito.mock(EntityManagerFactory.class);
Mockito.when(entityManagerFactory.create()).thenReturn(entityManager);
SomeDao sut = new SomeDao(entityManagerFactory.class);
// now SomeDao will use your mocked EntityManager so you can set expectations
// on createQuery etc to drive your test scenarios
// ...
}
}