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