Junit消息(预期为...)未显示在具有回溯的控制台中

时间:2016-08-05 08:33:01

标签: java junit logback

我使用Logback with SLF4J(从log4j迁移),当我运行失败的junit测试时,没有显示测试失败的原因(AssertionFailedError:expect is<>但是<>)

所有其他日志都在运行。

我的回归配置:

<configuration>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %msg%n</pattern>
    </encoder>
    <filter class="com.jle.athleges.logback.TrashFilter">
        <logger>org.springframework</logger>
        <level>ERROR</level>
    </filter>
</appender>

<appender name="TRASH_FILE_APPENDER"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/logback_trash.log</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- daily rollover -->
        <fileNamePattern>logs/trash.log.%d{yyyy-MM-dd-HH-mm}.log</fileNamePattern>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>%relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
</appender>

<logger name="org.springframework">
    <appender-ref ref="TRASH_FILE_APPENDER" />
</logger>

<root level="debug">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="TRASH_FILE_APPENDER" />
</root>

我的单元测试:

    @Test
public void getAllMembers() {
    log.debug("Start getAllMember");

    long sizeBefore = repository.count();
    Member a = new Member();
    a.setFirstname("aaa");
    a.setLastname("hhh");
    a.setId(2L);

    Member b = new Member();
    b.setFirstname("aaa");
    b.setLastname("hhh");
    b.setId(1L);
    memberService.save(a);
    memberService.save(b);

    Assert.assertTrue(memberService.getAll().size() == 0);
    log.debug("End getAllMember");
}

当您看到我的服务返回超过0个元素并且我的测试失败时。所以,我收到了这条消息:

java.lang.AssertionError
    at org.junit.Assert.fail(Assert.java:86)
    at org.junit.Assert.assertTrue(Assert.java:41)
    at org.junit.Assert.assertTrue(Assert.java:52)
    at com.jle.athleges.test.integration.MemberServiceImpTest.getAllMembers(MemberServiceImpTest.java:72)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at ...

对于Log4J,语句是java.lang.AssertionError Expected&lt; 0&gt;是&lt; 2&gt;

即使我使用DEBUG而不是ERROR,结果也是一样的。

我不明白为什么部分预期&lt; 0&gt;未显示&lt; 2&gt;

由于

1 个答案:

答案 0 :(得分:0)

你声明了一个布尔值:

Assert.assertTrue(memberService.getAll().size() == 0);

框架只知道你想看到一个真正的价值,而不是价值的来源。调用断言时,memberService.getAll().size() == 0已经被评估过了。通常,使用更具体的断言更好。

你可以从

开始
assertEquals(0, memberService.getAll().size())

这会给你Expected <0> was <2>输出。

但我个人更喜欢Hamcrest风格的断言:

assertThat(memberService.getAll(), is(empty()))

其中isempty都是静态导入:

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.collection.IsEmptyCollection.empty;

这确保了测试代码及其输出都是最可读的。