2013-03-12 1 views
0

Цель состоит в том, чтобы иметь функциональный тест для жестко закодированного 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, хотя я не вставлял эту часть.

ответ

0

Не видя код приложения, трудно точно сказать, что предложить. Но можете ли вы просто издеваться над log4j Logger? Просто введите макет Logger и убедитесь, что на нем вызывают правильные методы журналов.

Если вы издеваетесь над FileOutputStream, то вы фактически тестируете log4j, а также проверяете свой собственный код приложения. Если вы не работаете в команде разработчиков log4j, вы, вероятно, не хотите этого делать.

+0

Функциональный тест состоял в том, чтобы воспроизвести дублирование журнала, когда несколько Loggers наследуются от родителя, все в пределах одного контейнера. Это было неправильное понимание log4j, которое вызвало дублирование в первую очередь, но, пытаясь написать тест, я лучше понимаю log4j. – bickelj

0

Ответ: исключить использование ServletUnit/HttpUnit, потому что они мешают. Я не знаю, была ли это статическая инициализация или личная область какого-то материала или и того, и другого, но когда я избавился от поддельного контейнера и просто создал простые классы, мне это было нужно.

Смежные вопросы