Witam,
Mam problem w jaki sposób mockować/wskazać mockowi, że ma wykonać prawdziwą metodę, która jest dostarczana za pomocą dependency injection (np. za pomocą adnotacji @ejb lub @Inject).
Oczywiście EJB nie jest tutaj istotną kwestią (transakcje nie mają znaczenia: liczy się mockowanie, gdzie występuje dependency injection). Celem jest wytestowanie logiki biznesowej, nie transakcji itp.
@Stateless
public class TaskService implements TaskServiceLocal {
@EJB
private TaskFacadeLocal taskDao;
@Override
public boolean taskExists(long id) {
Task idTask = taskDao.find(id);
if (idTask == null) {
return false;
} else {
return true;
}
}
}
@Stateless
public class TaskFacade extends AbstractFacade<Task> implements TaskFacadeLocal {
@PersistenceContext(unitName = "taskList-PU")
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public TaskFacade() {
super(Task.class);
}
}
public abstract class AbstractFacade<T> {
private Class<T> entityClass;
public AbstractFacade(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected abstract EntityManager getEntityManager();
public T find(Object id) {
return getEntityManager().find(entityClass, id);
}
}
Problem: w jaki sposób dostarczyć mock TaskFacadeLocal do środka mocka TaskService?
W teście brakuje mocka na TaskFacadeLocal
public class TaskServiceTest {
private static final Long RET_TASK_ID = 1L;
@Test
public void testTaskExists() throws Exception {
TaskService taskSrvUnderTest = mock(TaskService.class);
TaskFacade taskFacadeUnderTest = mock(TaskFacade.class);
Task a = new Task();
a.setTaskId(RET_TASK_ID);
when(taskSrvUnderTest.taskExists(RET_TASK_ID)).thenCallRealMethod();
when(taskFacadeUnderTest.find(a)).thenReturn(a);
assertTrue(taskSrvUnderTest.taskExists(RET_TASK_ID));
verify(taskSrvUnderTest).taskExists(RET_TASK_ID);
}
}
Shalom