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