这可能是Mockito开发人员的一个问题,最终可能会导致错误,请参见底部的“更新” 。
以下代码
test_0-通过-符合预期
test_1-失败-为什么? <-这是我不理解的东西。
test_2-通过-符合预期
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 Eclipse 4.9上使用jdk8。
更新:
在调试时,我注意到: matches(...) 和 same(...) 都作为 org.mockito.internal.matchers.Matches.class 和 org.mockito.internal.matchers.Same.class
两者均实现 org.mockito.ArgumentMatcher 接口
但是由于某种原因,在执行 Mameers.matches(对象实际) Same.matches(对象实际) 方法时, / em> 从未被调用
请有人指出我想念什么?
答案 0 :(得分:-1)
匹配器重叠存在问题。如果您尝试不使用
when(a.read(anyString()).getData()).thenReturn(m1)
test_1()将通过。