Mockito:基本代码疑惑

时间:2015-12-01 14:29:40

标签: java junit mockito

我正在学习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;
    }

}

2 个答案:

答案 0 :(得分:2)

假设您的测试类已注释并使用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());
}

如果您确实需要测试它是否已正确保留,那么内存数据库将是您的最佳选择。

答案 1 :(得分:0)

Mockito对于测试处理持久层的案例很差。您应该使用嵌入式容器来测试持久层。嵌入式容器是一个内存数据库,可以模拟您的数据库,并且可以快速创建,使其成为单元测试的理想选择。

看看这个问题并阅读 SECOND 答案:

Testing an EJB with JUnit