[logback-user] Test logging in unittest

Ceki Gulcu listid at qos.ch
Mon Jul 14 15:58:45 CEST 2008


Claus,
Thank you for posting your recipe for unit testing.

If you wanted, you could inspect the contents of the log events to see if it 
meets your expectations. For example you could write.

   assertEquals("Exactly 1 failure should have been logged.", 1, 
listAppender.list.size());

  // inspect message contents:
  LoggingEvent le = listAppender.list.get(0);
     assertTrue(le.getFormattedMessage().startsWith("whatever you expect it to 
start with"));

HTH,

clanie wrote:
> Yes, that's certainly clearer, thank you.
> 
> Just to in case others with the same problem stumbles upon this thread,
> here's the new improved version the test:
> 
> /**
>  * Tests that closeChannels() tries to close all the supplied Channels,
>  * even if supplied with nulls and Channels which fail to close.
>  */
> @Test
> public void testCloseChannels() {
>     // Capture log entries from FileUtil
>     Logger logger = (Logger) LoggerFactory.getLogger(FileUtil.class);
>     logger.setAdditive(false);
>     ListAppender<LoggingEvent> listAppender =
>         new ListAppender<LoggingEvent>();
>     listAppender.start();
>     logger.addAppender(listAppender);
>     // Close a mix of normal, broken and completely missing channels
>     closeChannelse(null, new UnclosableChannelStub(),
>         null, new ChannelStub(), new ChannelStub());
>     // Restore normal logging
>     logger.detachAppender(listAppender);
>     logger.setAdditive(true);
>     // Perform checks
>     assertEquals("Exactly 1 failure should have been logged.", 1,
> listAppender.list.size());
> }
> 
> 
> 
> 
> Ceki Gulcu-2 wrote:
>>
>> Hello Claus,
>>
>> A slightly easier way would be to use a ListAppender, which appends each
>> event 
>> into a ...list. Logback-core has an implementation of about 10 lines each
>> which 
>> is extensively for testing purposes in the other modules.
>>
>> Here it is:
>>
>> package ch.qos.logback.core.read;
>>
>> import java.util.ArrayList;
>> import java.util.List;
>>
>> import ch.qos.logback.core.AppenderBase;
>>
>> public class ListAppender<E> extends AppenderBase<E> {
>>
>>    public List<E> list = new ArrayList<E>();
>>
>>    protected void append(E e) {
>>      list.add(e);
>>    }
>> }
>>
>> Check the tests where ListAppender is used. I think BasicLoggerTest should
>> give 
>> you a good idea of usage.
>>
>>
>>
>> HTH,
>>
>> Claus Nielsen wrote:
>>> I have a unit test which checks that a class writes the log statements 
>>> it's supposed to.
>>>
>>> The following code works, but I was wondering if there isn't a better or 
>>> easier way to do this.
>>>
>>> Here's what I have now:
>>>
>>> public void testCloseChannels() {
>>>      Logger rootLogger = (Logger)
>>>          LoggerFactory.getLogger(
>>>              LoggerContext.ROOT_NAME);
>>>      Appender<LoggingEvent> appender =
>>>          rootLogger.getAppender("console");
>>>      appender.addFilter(new Filter() {
>>>          @Override
>>>          public FilterReply decide(Object o) {
>>>              LoggingEvent event = (LoggingEvent) o;
>>>              if (event.getMessage().equals("Failed to close channel.")) {
>>>                  expectedLogEntryCount.incrementAndGet();
>>>                  return FilterReply.DENY;
>>>              }
>>>              return FilterReply.NEUTRAL;
>>>          }
>>>      });
>>>      close(null, new UnclosableChannelStub(), null,
>>>          new ChannelStub(), new ChannelStub());
>>>      assertEquals("Exactly 1 failure should have been logged.",
>>>          1, expectedLogEntryCount.intValue());
>>>      appender.clearAllFilters();
>>> }
>>>
>>>
>>> Regards,
>>> Claus Nielsen
>> -- 
>> --
>> Ceki Gülcü
>> QOS.ch is looking to hire talented developers located in Switzerland.
>> If interested, please contact c e k i AT q o s . c h
>> _______________________________________________
>> Logback-user mailing list
>> Logback-user at qos.ch
>> http://qos.ch/mailman/listinfo/logback-user
>>
>>
> 

-- 
--
Ceki Gülcü
QOS.ch is looking to hire talented developers located in Switzerland.
If interested, please contact c e k i AT q o s . c h



More information about the Logback-user mailing list