首页 > 解决方案 > 解释模拟匹配(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.classorg.mockito.internal.matchers.Same.class的实例分别

两者都实现了 org.mockito.ArgumentMatcher接口

但是由于某种原因,在执行期间Same.matches(Object actual)方法被调用,而Matchers.matches(Object actual )从未被调用

请有人能指出我想念什么吗?

标签: javajunitmockitomatcher

解决方案


重叠匹配器存在问题。如果你尝试不

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

test_1() 将通过。


推荐阅读