Это может быть вопрос к разработчикам Mockito, который может привести к ошибке, см. «Обновление» внизу.
Следующий код
test_0 - PASS - как ожидалось
test_1 - FAIL - ПОЧЕМУ ??<- это то, что я не понимаю. </strong>
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>
использование jdk8 в Windows 10. Eclipse 4.9.
Обновление:
Во время отладки я заметил, что: Оба совпадают (...) и то же самое (...) заканчиваются экземплярами org.mockito.internal.matchers.Match.класс и org.mockito.internal.matchers.Same.class соответственно
Оба реализуют org.mockito.ArgumentMatcher interface
Но по какой-то причине во время выполнения Same.matches (объект актуальный) метод вызывается при вызове Matchers.matches (Объект актуальный) никогда не вызывается
Пожалуйста, кто-нибудь может указать, что мне не хватает?