Question

Can we use Mockito to write tests for methods which implements repository calls? For example below method is using Named query to get eBooks from a Book Repository -

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

Thanks.

Was it helpful?

Solution

Yes you can. The question is though are you testing YOUR code or ATG in this instance?

Assuming your method above is contained in a class called GetBooks your test could look something like this:

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

This gives a greenbar when executed via TestNG. But what are you really testing here?

On a separate note. You should really use (protected) constants more since you'll then be able to use them in the package scope of your Mockito tests.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top