Как смоделировать репозиторий вызовов ATG

Можем ли мы использовать 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;
}

Благодарю.

1 ответ

Решение

Да, ты можешь. Вопрос в том, тестируете ли вы ВАШ код или 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?
}

Это дает greenbar когда выполняется через TestNG, Но что вы на самом деле тестируете здесь?

На отдельной заметке. Вы должны действительно использовать (protected) констант больше, так как тогда вы сможете использовать их в объеме пакета вашего Mockito тесты.

Другие вопросы по тегам