2013-01-31 100 views
3

我開始在用於連接到我的數據存儲的某些服務類上使用Mockito進行一些測試。我現在想確定編寫測試的最佳實踐方式。原則是每個實體都有一種方法可以從數據存儲(mongo/mysql等)中爲特定實體列出,添加,刪除等行。單元測試使用Mockito的Java Play Framework中的服務類

把這個類,讓我跟我的數據庫存儲公司

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做什麼列表?

回答

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 
} 
0

如果數據庫查詢返回並返回空結果,或者如果行具有空值或意外值,則可以測試代碼的工作方式。你可以模擬db類來返回這些值。你也可以模擬db類拋出一個異常來看你的代碼如何反應。

相關問題