4

我正在使用 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 来测试?

4

2 回答 2

2

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

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
}
于 2013-01-31T18:03:07.687 回答
0

您可以测试如果 db 查询返回并且结果为空、null 或者行具有空值或意外值,您的代码将如何工作。您可以模拟 db 类以返回这些值。您还可以模拟 db 类以引发异常,以查看您的代码如何反应。

于 2013-01-31T18:02:05.260 回答