我正在学习Mockito,我很难理解一些东西。假设我想测试一个Doa方法,该方法获取对象列表并通过遍历列表将其保存在DB中。如何使用Mockito进行测试。下面是代码示例。
import java.util.Iterator;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
@Repository
public class AuditDaoImpl {
@PersistenceContext(unitName = "somepersistance")
EntityManager entityManager;
public <T> boolean saveAuditData(List<T> dataList) {
Iterator<Data> itr = (Iterator<Data>) dataList.iterator();
while (itr.hasNext()) {
Data Data = (Data) itr.next();
Audit audit = new Audit();
audit.setUserName(Data.getUserName());
entityManager.persist(audit);
}
return true;
}
}
假设您的测试类是带注释的,并且使用spring(通过使用@RunWith(SpringJUnit4ClassRunner.class)
和@ContextConfiguration("classpath:applicationContext.xml")
)注释运行,那么您就可以工作了。如果您主要关心的是验证是否为每个元素调用了entityManager.persist(audit);
,那么类似这样的东西应该可以在中工作
@Autowired //Autowired to get mockito to inject into the spring-handled dao
@InjectMocks
AuditDaoImpl auditDao;
@Mock
EntityManager entityManager;
@Test
public void saveAllAudit_entityManagerShouldPersistAll() {
List<Data> dataList = new ArrayList<>();
dataList.add(new Data("username"));
//add more to list
auditDao.saveAuditData(dataList);
verify(entityManager, times(1)).persist(anyObject());
}
如果您确实需要测试它是否正确地持久化,那么内存中的数据库将是一种方法。
Mockito不适合测试处理持久层的用例。您应该使用嵌入式容器来测试持久层。嵌入式容器是模拟数据库的内存中数据库,创建速度快,非常适合单元测试。
看看这个SO问题,阅读第二个答案:
使用JUnit 测试EJB