2013-08-01 30 views
0

我們可以使用Mockito爲實現庫調用的方法編寫測試嗎?例如,下面的方法是使用命名查詢從書庫中獲取電子書 -如何模擬庫調用ATG

public RepositoryItem[] getEBooks(DynamoHttpServletRequest request) { 
    RepositoryItem[] results = null; 
    Repository rep = (Repository) request.resolveName("/atg/products/BookRepository"); 
    try { 
     RepositoryItemDescriptor desc = rep.getItemDescriptor("Book"); 
     RepositoryView view = desc.getRepositoryView(); 
     if (view instanceof NamedQueryView) { 
      NamedQueryView nameView = (NamedQueryView) view; 
      ParameterSupportView pSupportView = (ParameterSupportView) view; 
      String queryName = "GetBooks"; 
      Query namedQuery = nameView.getNamedQuery(queryName); 
      Object[] params = { "ebook" }; //book type 
      results = pSupportView.executeQuery(namedQuery, params); 
     } 
    } catch (RepositoryException e) { 
     logError(e.getMessage()); 
    } 
    return results; 
} 

謝謝。

回答

4

是的,你可以。問題是你在這個例子中測試你的代碼還是ATG?

假設你的方法上面被包含在一個叫做GetBooks您的測試類可以是這個樣子:

@InjectMocks private GetBooks testObj; 

@Mock private DynamoHttpServletRequest requestMock; 
@Mock private Repository bookRepositoryMock; 
@Mock private RepositoryItemDescriptor bookRepositoryItemDescriptorMock; 
@Mock private GSAView bookRepositoryViewMock; //The only oddity here but GSAView is the common denominator for NamedQueryView and ParameterSupportView 
@Mock private Query namedQueryMock; 

@Mock private RepositoryItem resultRepositoryItem1, resultRepositoryItem2; 


@BeforeMethod(groups = { "unit" }) 
public void setup() throws Exception { 
    testObj = new GetBooks(); 
    MockitoAnnotations.initMocks(this); 

    Mockito.when(requestMock.resolveName("/atg/products/BookRepository")).thenReturn(bookRepositoryMock); 
    Mockito.when(bookRepositoryMock.getItemDescriptor("Book")).thenReturn(bookRepositoryItemDescriptorMock); 
    Mockito.when(bookRepositoryItemDescriptorMock.getRepositoryView()).thenReturn(bookRepositoryViewMock); 
    Mockito.when(bookRepositoryViewMock.getNamedQuery("GetBooks")).thenReturn(namedQueryMock); 

    List<RepositoryItem> resultArrayList = new ArrayList<RepositoryItem>(); 
    resultArrayList.add(resultRepositoryItem1); 
    resultArrayList.add(resultRepositoryItem2); 

    Object[] params = { "ebook" }; //It may be simpler to test if this was a constant 

    Mockito.when(bookRepositoryViewMock.executeQuery(namedQueryMock, params)).thenReturn(resultArrayList.toArray(new RepositoryItem[resultArrayList.size()])); 

} 

@Test(groups = { "unit" }) 
public void testGetEBooks()throws Exception{ 

    RepositoryItem[] result = testObj.getEBooks(requestMock); 
    Assert.assertTrue(result.length == 2); //What do you want to test? 
} 

當通過TestNG執行這給出了一個greenbar。但是你在這裏測試的是什麼?

另行註釋。您應該更多地使用(protected)常量,因爲您可以在Mockito測試的程序包範圍內使用它們。

+0

謝謝。那麼目的是測試方法不是ATG。通常,具有存儲庫調用的方法需要一些參數,使用該參數執行查詢並返回結果。問題是,我們不能避免爲這種方法編寫測試,假設ATG會正確地發揮它的作用。或者,我們應該按照上面的解釋寫一個最簡單的方法。 – Saurabh

+0

@Saurabh在我參與過的一個項目上,我們已經爲小滴和窗體處理程序編寫了數百個測試,並且在大多數情況下,這涉及到從存儲庫中獲取數據。我們的測試主要集中在我們如何處理存儲庫中的數據,而不是(如上所述)如何獲取數據。不幸的是,您有時必須模擬您如何獲取數據,以便測試數據的使用情況,這一切都取決於。上述方法對我來說工作得非常好,我也將它應用於我當前的項目。 – radimpe

+0

謝謝。這些筆記會在我的項目中編寫測試時引導我。 :) – Saurabh