Объясните причину такого поведения совпадений mockito (str) vs same (str) - PullRequest
0 голосов
/ 19 ноября 2018

Это может быть вопрос к разработчикам 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 (Объект актуальный) никогда не вызывается

Пожалуйста, кто-нибудь может указать, что мне не хватает?

1 Ответ

0 голосов
/ 19 ноября 2018

Существует проблема с перекрывающимися совпадениями.Если вы попытаетесь без

when(a.read(anyString()).getData()).thenReturn(m1)

test_1 () пройдет.

...