说明这种模仿匹配(str)与same(str)

时间:2018-11-18 23:02:44

标签: java junit mockito matcher

这可能是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> 从未被调用

请有人指出我想念什么?

1 个答案:

答案 0 :(得分:-1)

匹配器重叠存在问题。如果您尝试不使用

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

test_1()将通过。