java - 解释模拟匹配(str)与相同(str)的这种行为的原因
问题描述
这可能是 Mockito 开发人员的一个问题,最终可能会成为错误,请参阅底部的“更新” 。
以下代码
test_0 - PASS - 正如预期的那样
test_1 -失败 - 为什么?<--这是我不明白的事情。
test_2 - PASS - 正如预期的那样
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.matches;
import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.regex.Pattern;
import org.junit.Test;
public class Test_mockito_strange {
public static class A {
protected B b = new B();
public B read(String s) {
return b;
}
}
public static class B {
String[] getData() {
return new String[] {
"aa"
};
}
}
@Test
public void test_0() {
assertTrue(Pattern.matches("00", "00"));
assertTrue(Pattern.matches("11", "11"));
}
@Test
public void test_1()
{
A a = mock(A.class, RETURNS_DEEP_STUBS);
String[] m1 = new String[] {"bb"};
String[] m2 = new String[] {"cc"};
String[] m3 = new String[] {"dd"};
when(a.read(anyString()).getData()).thenReturn(m1);
when(a.read(matches("00")).getData()).thenReturn(m2);
when(a.read(matches("11")).getData()).thenReturn(m3);
assertTrue("cc".equals(a.read("00").getData()[0]));
assertTrue("dd".equals(a.read("11").getData()[0]));
assertTrue("bb".equals(a.read("33").getData()[0]));
}
@Test
public void test_2()
{
A a = mock(A.class, RETURNS_DEEP_STUBS);
String[] m1 = new String[] {"bb"};
String[] m2 = new String[] {"cc"};
String[] m3 = new String[] {"dd"};
when(a.read(anyString()).getData()).thenReturn(m1);
when(a.read(same("00")).getData()).thenReturn(m2);
when(a.read(same("11")).getData()).thenReturn(m3);
assertTrue("cc".equals(a.read("00").getData()[0]));
assertTrue("dd".equals(a.read("11").getData()[0]));
assertTrue("bb".equals(a.read("33").getData()[0]));
}
}
在 pom.xml 我得到了
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.23.0</version>
<scope>test</scope>
</dependency>
在 Windows 10 上使用 jdk8。Eclipse 4.9。
更新:
在调试时我注意到:matches(...)和same(...)最终都作为org.mockito.internal.matchers.Matches.class和org.mockito.internal.matchers.Same.class的实例分别
两者都实现了 org.mockito.ArgumentMatcher接口
但是由于某种原因,在执行期间Same.matches(Object actual)方法被调用,而Matchers.matches(Object actual )从未被调用
请有人能指出我想念什么吗?
解决方案
重叠匹配器存在问题。如果你尝试不
when(a.read(anyString()).getData()).thenReturn(m1)
test_1() 将通过。
推荐阅读
- angular - 从角度 http.get 返回正确的对象与承诺
- influxdb - kapacitor批处理中的派生节点
- arrays - Yii2 ArrayHelper 显示父类
- javascript - 如何使用 node 和 express 在 shopify 应用程序前端获取当前商店详细信息
- php - 如果数据是阿拉伯语,则在 ajax 函数中获取字母“a”
- amazon-s3 - QNAP 备份到 s3
- r - 如何修改ggplot2中的堆积条形图使其发散
- c# - ASP.NET Core 在调试时读取内容文件
- python - 在 simpy 中按计划生成客户
- python-3.x - tesseract 输出与输入图像不同