2016-11-28 44 views
2

创建日志,我有以下代码:我如何断定我的日志消息时由龙目岛

@Component 
@Slf4j 
public class MyClass { 

    private OtherClass otherClass; 

    @Autowired 
    public MyClass(OtherClass otherClass) { 
     this.otherClass = otherClass; 
    } 

    public void start() { 
     try { 
      otherClass.execute(); 
     } catch (FeatureException exception) { 
      log.warn(exception.getMessage()); 
     } 
    } 

我想要做的测试,以验证日志消息。 我不知道如何。

感谢

+0

如果您需要验证日志消息,那可能是代码异味。你能详细说明为什么你需要验证日志消息吗? –

+1

@AlastorMoody存在一些需要特定消息的使用案例:客户端请求正确记录此特定消息,因为其他工具期望它;一个项目经理说,我想要100%的代码覆盖率,包括日志语句等。 –

+0

您可以制作一个程序包专用异常(PPE),它扩展了您的FeatureException异常。这个PPE有一个logMessage()方法,它可以构造你想要的消息,而不用询问调用代码的消息。此PPE为您提供所需的日志消息,并且在您的单元测试中可以检查是否引发了包私有异常。来自公共调用者,他们仍然可以捕获FeatureException。这是否能解决您的问题?如果这有效,那么我可以将此评论转换为答案,以便您可以接受它。如果没有,你可以在logMessage上使用assertEquals。 –

回答

1

SLF4J project recommends using用于该用途的情况下,库SLF4J Test

在你的情况(使用Hamcrest和作为的Mockito井):

public class MyClassTest { 

    TestLogger logger = TestLoggerFactory.getTestLogger(MyClass.class); 

    @Test 
    public void testStart_loggingFailureMessage() { 
    OtherClass otherClass = mock(OtherClass.class); 
    MyClass myClass = new MyClass(otherClass); 

    when(otherClass.execute()).thenThrow(new FeatureException("Some text")); 

    myClass.start(); 

    assertThat(logger.getLoggingEvents(), is(asList(LoggingEvent.warn("Some text")))); 
    } 

    @After 
    public void clearLoggers() { 
    TestLoggerFactory.clear(); 
    } 
} 
0

万一其他的解决办法不为你工作,另外一个选择:你可以验证例外通过otherClass.execute()

抛出

A)认为,以getMessage()

B)被钓到了一条通话(你可以写一个测试抛出一个运行时异常,你会希望打你的测试用例,并抛出一个FeatureException第二测试...这显然不应该在测试用例中使用)。