0

我们可以使用 Mockito 为实现存储库调用的方法编写测试吗?例如下面的方法是使用命名查询从图书存储库中获取电子书 -

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

1 回答 1

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

这给出了一个greenbarwhen 执行 via TestNG。但是你在这里真正测试的是什么?

在单独的说明中。您应该protected更多地使用 ( ) 常量,因为这样您就可以在Mockito测试的包范围内使用它们。

于 2013-08-01T09:21:25.927 回答