Цель состоит в том, чтобы иметь функциональный тест для жестко закодированного log4j Appender, который расширяет RollingFileAppender, где я могу воспроизвести несколько экземпляров log4j logger, записывающих один файл с помощью MyAppender. Мой подход состоял в том, чтобы перехватить создание FileOutputStream, созданного классом FileAppender log4j.Как мне mock java.io.FileOutputStream с Powermockito, когда он создан Log4j?
Но вызовы System.out в анонимных ответах никогда не вызываются. Когда я поставил точку останова на конструкторах FileOutputStream, я вижу, что он создается точно так, как я ожидаю, с аргументами, указанными ниже. Когда я накладываю точку прерывания на методы записи, вызывается три версии arg.
Я использую ServletUnit измерительного прибора для имитации нахождения в контейнере. MyLogAppender.logFile является константой.
Что мне не хватает?
@Test
@PrepareForTest({MyLogAppender.class})
public void MyLogMessageGetsWritten() throws SAXException, IOException, Exception {
//...
// INTERCEPT LOG HERE SOMEHOW
PowerMockito.mockStatic(FileOutputStream.class);
FileOutputStream mockFos = PowerMockito.mock(FileOutputStream.class);
PowerMockito.whenNew(FileOutputStream.class).withParameterTypes(String.class, boolean.class).withArguments(MyLogAppender.logFile, true).thenReturn(mockFos);
//...
PowerMockito.doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
Object mock = invocation.getMock();
System.out.println("write(byte[], int, int) Called with " + args);
return args;
}
}).when(mockFos).write(any(byte[].class), anyInt(), anyInt());
//...
// ASSERT LOG SUCCESS HERE
}
P.S. Я работаю с PowerMockRunner, хотя я не вставлял эту часть.
Функциональный тест состоял в том, чтобы воспроизвести дублирование журнала, когда несколько Loggers наследуются от родителя, все в пределах одного контейнера. Это было неправильное понимание log4j, которое вызвало дублирование в первую очередь, но, пытаясь написать тест, я лучше понимаю log4j. – bickelj