gpt4 book ai didi

java - 解释mockito matches(str) 与 same(str) 这种行为的原因

转载 作者:行者123 更新时间:2023-12-01 06:02:54 25 4
gpt4 key购买 nike

这可能是 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 上使用 jdk8。Eclipse 4.9。

更新:

<小时/>

在调试时我注意到:matches(...)same(...) 最终都会作为 same(...) 的实例>org.mockito.internal.matchers.Matches.classorg.mockito.internal.matchers.Same.class 分别

两者都实现org.mockito.ArgumentMatcher接口(interface)

但在执行过程中由于某种原因Same.matches(Objectactual)方法被调用,而Matchers.matches(Objectactual) 从未被调用

请有人指出我错过了什么吗?

最佳答案

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

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

test_1() 将通过。

关于java - 解释mockito matches(str) 与 same(str) 这种行为的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53366308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com