Hamcrest CombinableMatcher 的评估顺序

Order of evaluation of Hamcrest CombinableMatcher

我想为 matcher_1 AND matcher_2 OR matcher_3 and matcher_4 这样的匹配器编写一个逻辑,其中 matcher_i 只是 hamcrest 匹配器的占位符。

我决定用CombinableMatcher这样写-

new CombinableMatcher<String>(matcher_1).and(matcher_2).or(matcher_3).and(matcher_4)

现在,问题是匹配器的评估顺序是什么?

会是((((matcher_1) AND matcher_2) OR matcher_3) and matcher_4)还是 任何其他订单,例如 ((matcher_1 AND matcher_2) OR (matcher_3 and matcher_4)) ?

匹配器结果将从左到右计算。所以,它将是 ((((matcher_1) AND matcher_2) OR matcher_3) and matcher_4) 而不是 ((matcher_1 AND matcher_2) OR (matcher_3 and matcher_4)).

mockito 3.11 和 hamcrest 2.2 中的以下示例 运行 证明了上述内容 -

    @RunWith(MockitoJUnitRunner.class)
    public class SomeTest {
    
        @Mock
        SomeInterface mock;
    
    
        @Test
        public void test(){
    
            when(mock.complicatedMethod(eq(1), MockitoHamcrest.argThat(
    
                    new CombinableMatcher<String>(equalTo("hello"))
                            .and(containsString("ello"))
                            .or(CoreMatchers.<String>instanceOf(String.class))
                            .and(containsString("XYZ"))
    
    
            ) )).thenReturn("done");
    
            System.out.println(mock.complicatedMethod(1 ,"hello"));// Prints null
    
        }
    
    
    
    }

interface SomeInterface {

    public String complicatedMethod(int i , String str) ;
}

如果匹配器结果按此顺序计算 ((matcher_1 AND matcher_2) OR (matcher_3 and matcher_4)) [顺便说一句 Java 布尔运算符的优先顺序],则“完成”将被打印但失败并为空被打印出来,这意味着 ((((matcher_1) AND matcher_2) OR matcher_3) and matcher_4) 是它正在考虑的内容。

很高兴看到有人理解组成匹配器的想法。

我想知道你为什么关心匹配器的顺序?理想情况下,这无关紧要,因为您也不知道调用匹配器的频率。

如果您在这个详细级别上遇到问题,最好编写一个自定义匹配器。