Я работаю над классом, который хранит некоторую информацию о сеансе связи для взаимодействия с сторонними API. Таким образом, в основном у него много поведения и небольшие состояния для поддержания. Вот один из его методы:Дилемма тестирования модулей
public LineItem getLineItem(
String networkId, String lineItemId) throws ApiException_Exception {
LineItem lineItem = null;
session.setCode(networkId);
LineItemServiceInterface lineItemService = servicesInterface.lineItemService(session);
StatementBuilder statementBuilder =
new StatementBuilder()
.where("id = " + lineItemId.trim())
.orderBy("id ASC")
.limit(StatementBuilder.SUGGESTED_PAGE_LIMIT);
LineItemPage lineItemPage =
lineItemService.getLineItemsByStatement(statementBuilder.toStatement());
if (lineItemPage != null && lineItemPage.getResults() != null) {
lineItem = lineItemPage.getResults().get(0);
}
return lineItem;
}
я застрял на том, как проверить этот метод, он имеет слишком много неявных зависимостей на объекты третьих лиц. Объекты трудно создавать самостоятельно. Другой большой проблемой является то, что getLineItemByStatement
выполняет сетевой вызов (SOAP) за сценой.
На моей стороне я пытаюсь высмеять внешнюю службу и проверить, запрашивает ли служба данные с правильным Statement
, кроме того, что я ничего не могу сделать, поскольку у меня нет изменения состояния в моем объекте, и большая часть взаимодействие объекта - это третья сторона.
Вопрос
Большая путаница в этих сценарии того, насколько мой класс должен знать о коллаборационистов? Насколько мой тест должен знать об использовании объектов моим тестируемым методом?
пример:
@Test
public void shouldGetLineItem() throws ApiException_Exception {
when(servicesInterface.lineItemService(dfpSession)).thenReturn(mockLineItemService);
dfpClient.getLineItem("123", "123");
Statement mockStatement = mock(Statement.class);
Statement statement =
new StatementBuilder()
.where("id = 123")
.orderBy("id ASC")
.limit(StatementBuilder.SUGGESTED_PAGE_LIMIT)
.toStatement();
verify(dfpSession).setNetworkCode("123");
verify(mockLineItemService).getLineItemsByStatement(isA(Statement.class));
}
Как мы можем видеть, что мой тест слишком много знает о моем методе испытуемым.
Update 1
Через некоторое время я вижу, что его стало слишком трудно единицы проверить мои классы, потому что Другой крупный в LineItem
разбросана повсюду и так LineItem
имеет много глубокие ссылки на другие объекты и трудно создать мой поэтому я решил создать модель домена, которая содержит соответствующие данные для моего приложения.
public LineItemDescription getLineItem(String networkId, String lineItemId)
throws ApiException_Exception {
dfpSession.setNetworkCode(networkId);
LineItemServiceInterface lineItemService = servicesInterface.lineItemService(dfpSession);
return buildLineItemDescription(
getFirstItemFromPage(lineItemService.getLineItemsByStatement(buildStatement(lineItemId))));
}
Отказывание выглядит правильным ответом на меня. Какова конкретная проблема? –
@JBNizet обновлен с вопросом и модульным тестом в настоящее время. – vivek