Измешивание на статическое поле, которое является классом с MockitoJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Измешивание на статическое поле, которое является классом с Mockito

Сообщение Anonymous »

У моего класса UTILS есть метод инициирования, зависящий от внешних ресурсов (например, подключение к базе данных), который я безуспешно издевался над Mockito. Похоже, что UTILS может быть разделен на экстремальную роль моего приложения, поэтому объявляется как статическая (то есть переменная класса) в < /p>
public class EmailNotificationWorkItemHandler extends AbstractLogOrThrowWorkItemHandler {
private static Utils utils = new Utils();

public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {

// Throw an error due to many missing parameters on the workitem
String id= (String) workItem.getParameter("ID");

...
try {
RequiredParameterValidator.validate(this.getClass(), workItem);
...
} catch (Throwable e) {
utils.insertErrors(id, errorCode, errorMessage, e.getStackTrace(), -1L); // testing this method called
}

...
}

< /code>
Я понимаю, что могу использовать инъекцию зависимостей для UTIL, но избегаю пружины. Сообщения о насмешливых статических полях заставляют меня чувствовать, что я близок: < /p>
@Test
public void executeWorkItemMissingParametersTest() {

Utils mockUtils = mock(Utils.class);
WorkItemManager mockWorkItemMgr = mock(WorkItemManager.class);
EmailNotificationWorkItemHandler mockWorkItemHandler = mock(EmailNotificationWorkItemHandler.class);

doAnswer(new Answer() {
public Void answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
System.out.println("called with arguments: " + Arrays.toString(args));
return null;
}
}).when(mockUtils).insertErrors(any(), any(), any(), any(), anyLong());

try {
doAnswer(new Answer() { // Unfinished stubbing detected
public Void answer(InvocationOnMock invocation) {
return null;
}
}).when(mockUtils);
Utils.init();
} catch (Exception e) {
System.out.println("In mocking of Utils.init() " + e.getLocalizedMessage());
}

WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter("ID", "1111-AAAA");
// Lots of required parameters removed to cause an exception and insertErrors to be called

mockWorkItemHandler.executeWorkItem(workItem, mockWorkItemMgr);
verify(mockUtils).insertErrors(any(), any(), contains("RequiredParameterValidator"), any(), anyLong());
}
< /code>
Но реальный экземпляр UTIL используется и называется в MockWorkitemHandler - не издеваренных UTILS - и «незаконченное загрязнение, обнаруженное», происходит исключение, где отмечено выше. Моя цель состоит в том, чтобы проверить призыв Utils.inserterrors, как прокомментировано в коде, и сделать это без побочных эффектов UTILS. Что мне не хватает в своих макетах, чтобы (1) использовать высмеиваемые утилиты (без побочных эффектов, таких как подключения к базе данных) и (2) для проверки того, что UTILS. -Inerterrors MockWorkitemHandler.>

Подробнее здесь: https://stackoverflow.com/questions/713 ... th-mockito
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»