使用Mockito在Java Play框架中对服务类进行单元测试

使用Mockito在Java Play框架中对服务类进行单元测试,java,junit,playframework,mockito,Java,Junit,Playframework,Mockito,我正在使用Mockito对一些用于连接数据存储的服务类进行测试。现在我想确定为它编写测试的最佳实践方式。原则是,对于每个实体,都有一种方法可以从特定实体的数据存储(mongo/mysql等)中列出、添加、删除一行 通过这个课程,我可以与存储公司列表的数据库进行对话 public class CompanyService extends Service{ public CompanyService() { ... } public saveCompany(

我正在使用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);
         }

    }

}
公共类公司服务扩展服务{
上市公司服务{
...
}
公共储蓄公司(公司){
...
}
//获取所有公司的列表
上市公司(){
上市公司=新ArrayList();
试一试{
CompanyResult行=db.query(..);
for(行:rows.getResult()){
companys.add(row.getColumns());
}
捕获(例外e){
logger.warn(“检索公司时出错”,e);
}
}
}

我应该在getCompanies方法中测试什么,以及如何使用Mockito来测试?

如果db查询返回空结果,或者行中有空值或意外值,则可以测试代码的工作方式。可以模拟db类来返回这些值。还可以模拟db类来向se抛出异常e您的代码如何反应。

您所测试的系统是公司服务。您想测试它,假设它的所有依赖项/协作者都正常工作,它也正常工作

db
对象似乎是
getcompanys()
方法中唯一需要担心的依赖项/协作者。使用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
}
@测试
上市公司(){
/***传讯***/
CompanyService cs=新CompanyService();
//安装模拟数据库
DB mockDb=mock(DB.class);
//为查询设置假结果
CompanyResult sampleResults=…//在此处生成示例结果
//查询模拟返回假结果
当(db.query(/*匹配参数*/)。然后返回(sampleResults);
//告诉您的测试系统使用模拟协作器
cs.setDB(mockDb);
/***表演***/
CompanyResult results=cs.getcompanys();
/***断言***/
…//测试结果和采样器结果是否完全相同
}