AssertJ 结果反馈 "iterable asserts"

AssertJ result feedback with "iterable asserts"

我正在检查字符串列表是否包含满足特定条件的特定数字,特别是它们包含子字符串,忽略大小写。

所以我想到了这个(failedResults 字段的原因将变得显而易见):

    class ContainsIgnoringCase extends Condition<CharSequence> {
        private String lCString;
        private int failedResults = 0;
        int getFailedResults(){
            return failedResults;
        }

        ContainsIgnoringCase( String string ){
            lCString = string.toLowerCase();
        }

        @Override
        public boolean matches( CharSequence value ) {
            boolean result = value.toString().toLowerCase().contains( lCString );
            if( ! result ){
                failedResults++;
            }
            return result;
        }
    }

如果失败:

    assertThat( paramsPassed ).haveExactly( 7, new ContainsIgnoringCase( "documents" ));

它打印出 List<String> paramsPassed,但没有说明实际的失败次数。

我认为这可能会成功,但事实并非如此:

    ContainsIgnoringCase cic = new ContainsIgnoringCase( "documents" );
    assertThat( paramsPassed ).as( "failed: " + cic.getFailedResults() ).haveExactly( 7, new ContainsIgnoringCase( "documents" ));

... 这只是打印 "failed 0",所以显然在执行测试之前调用了方法 getFailedResults()。在 AssertJ 内部的某个地方,这个失败数字一定是被计算出来的……有没有办法为用户打印出来?

为您的条件添加一个 toString 例如:

    @Override
    public String toString() {
        return "elements containing '" + this.lCString + "' but it failed for " + getFailedResults();
    }

给定 paramsPassed = list("documents", "2"); 它会给出如下错误:

Expecting elements:
<["documents", "2"]>
 to have exactly 7 times <elements containing 'documents' but failed = 1>