使用Mockito对Java Play Framework中的服务类进行单元测试

我正在使用Mockito开始测试我用于连接数据存储的一些服务类.我现在想确定为其编写测试的最佳实践方法.原则是每个实体都有一种方法可以从数据存储(mongo /
mysql等)中为特定实体列出,添加,删除等一行.

拿这个允许我与存储公司列表的数据库交谈的课程

public class CompanyService extends Service{
    public CompanyService() {
        ...
    }

    public saveCompany(Company company) {
         ...
    }

     // get a list of all companies
    public List<Company> getCompanies() {

         List<Company> companies = new ArrayList<Company>();

         try {
             CompanyResult<Rows<String, String>> rows = db.query(....); 

             for (Row<String, String> row : rows.getResult()) {
                 companies.add(row.getColumns());
             }
         catch (Exception e){
            logger.warn("Error retrieving companies", e);
         }

    }

}

究竟应该在getCompanies方法中测试什么?我如何使用Mockito来做?

最佳答案 您的受测系统是公司服务.您想要测试它,假设其所有依赖项/协作者正常运行,它可以正常运行.

db对象看起来像是getCompanies()方法中需要担心的唯一依赖项/协作者.使用Mockito模拟对db.query()的调用

你可以像这样设置一个测试方法:

@Test
public void testGetCompanies() {
  /*** Arraign ***/
  CompanyService cs = new CompanyService();

  // Setup mock db
  DB mockDb = mock(DB.class);

  // Setup fake results for query
  CompanyResult<Rows<String, String>> sampleResults = ... // build sample results here

  // Have query on mock return fake results
  when(db.query(/* match arguments */)).thenReturn(sampleResults);

  // Tell your System Under Test to use the mock collaborator
  cs.setDB(mockDb);

  /*** Act ***/
  CompanyResult<Rows<String, String>> results = cs.getCompanies();

  /*** Assert ***/
  ... // Test that results and sampleResults are effectively the same
}
点赞