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)
是它正在考虑的内容。
很高兴看到有人理解组成匹配器的想法。
我想知道你为什么关心匹配器的顺序?理想情况下,这无关紧要,因为您也不知道调用匹配器的频率。
如果您在这个详细级别上遇到问题,最好编写一个自定义匹配器。
我想为 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)
是它正在考虑的内容。
很高兴看到有人理解组成匹配器的想法。
我想知道你为什么关心匹配器的顺序?理想情况下,这无关紧要,因为您也不知道调用匹配器的频率。
如果您在这个详细级别上遇到问题,最好编写一个自定义匹配器。