Как смоделировать репозиторий вызовов 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
тесты.