Witam,
Stawiam pierwsze kroki z Mockito. Napisałem test do trywialnej metody z instrukcją warunkową i nie otrzymuje spodziewanego wyniku.
Poniżej kod EJB, które chce przetestowć:
@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);
}
@Override
public boolean taskExists(long id) {
Task idTask = find(id);
if (idTask == null) {
return false;
} else {
return true;
}
}
}
Metoda abstrakcyjna będąca częścią generycznego DAO:
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);
}
}
Kod encji:
@Entity
@Table(name = "task")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Task.findAll", query = "SELECT t FROM Task t"),
@NamedQuery(name = "Task.findByTaskId", query = "SELECT t FROM Task t WHERE t.taskId = :taskId"),
@NamedQuery(name = "Task.findByName", query = "SELECT t FROM Task t WHERE t.name = :name"),
@NamedQuery(name = "Task.findByDescription", query = "SELECT t FROM Task t WHERE t.description = :description"),
@NamedQuery(name = "Task.findByStatus", query = "SELECT t FROM Task t WHERE t.status = :status"),
@NamedQuery(name = "Task.findByBegda", query = "SELECT t FROM Task t WHERE t.begda = :begda"),
@NamedQuery(name = "Task.findByEndda", query = "SELECT t FROM Task t WHERE t.endda = :endda")})
public class Task implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "task_seq", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "task_seq", sequenceName = "task_task_id_seq",
allocationSize = 1)
@Basic(optional = false)
@Column(name = "task_id")
private Long taskId;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 40)
@Column(name = "name")
private String name;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 255)
@Column(name = "description")
private String description;
@Basic(optional = false)
@NotNull
@Column(name = "status")
private int status;
@Basic(optional = false)
@NotNull
@Column(name = "begda")
@Temporal(TemporalType.TIMESTAMP)
private Date begda;
@Basic(optional = false)
@NotNull
@Column(name = "endda")
@Temporal(TemporalType.TIMESTAMP)
private Date endda;
public Task() {
this.status = 1;
this.begda = new Date();
this.endda = new Date();
}
public Task(String name, String description) {
this.name = name;
this.description = description;
this.status = 1;
this.begda = new Date();
this.endda = new Date();
}
public Long getTaskId() {
return taskId;
}
public void setTaskId(Long taskId) {
this.taskId = taskId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public Date getBegda() {
return begda;
}
public void setBegda(Date begda) {
this.begda = begda;
}
public Date getEndda() {
return endda;
}
public void setEndda(Date endda) {
this.endda = endda;
}
@Override
public int hashCode() {
int hash = 0;
hash += (taskId != null ? taskId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Task)) {
return false;
}
Task other = (Task) object;
if ((this.taskId == null && other.taskId != null) || (this.taskId != null && !this.taskId.equals(other.taskId))) {
return false;
}
return true;
}
@Override
public String toString() {
return "pl.seaduc.tasklist.Task[ taskId=" + taskId + " ]";
}
}
Poniżej prezentuje kod mojego testu.
public class TaskFacadeTest {
private TaskFacade taskFacade = mock(TaskFacade.class);
private static final long RET_TASK_ID = 1L;
@Test
public void testTaskExists() throws Exception {
Task searchedTask = mock(Task.class);
when(searchedTask.getTaskId()).thenReturn(RET_TASK_ID);
when(taskFacade.find(1L)).thenReturn(searchedTask);
assertTrue(RET_TASK_ID == searchedTask.getTaskId());
assertTrue(taskFacade.taskExists(searchedTask.getTaskId()));
verify(taskFacade).taskExists(searchedTask.getTaskId());
}
}
Otrzymuje wynik niezgodny z oczekiwanien. Mockito zwraca domyślną wartość zamiast taką o jaką prosiłem, jakby ignorowało mój mock, gdy wywołam metodę find.
Wywala się drugi assert. Na czym polega mój błąd? Wygląda na to, że metoda find zamiast mocka zwraca null. Dlatego otrzymuje false zamiast true. Nie rozumiem jednak dlaczego.