当前位置: 首页 > 知识库问答 >
问题:

Mockito嘲笑具有相似签名的相同命名方法

萧德馨
2023-03-14

我有一个类,比如说SimpleClass,它有两个函数,它们的名称相同,参数数量相同,但参数类型不同。现在,我假设模拟它们的返回值应该像使用两个when语句和适当的匹配器一样,但是当我尝试得到以下错误时:

组织。莫基托。例外。滥用。InvalidUseOfMatcherException:此处检测到错误放置的参数匹配器:

-

以下是我尝试的一个例子:

public class SimpleClass {

    public boolean doWork(String value, String name) {
        return false;
    }

    public boolean doWork(Integer value, String name) {
        return true;
    }
}



@RunWith(MockitoJUnitRunner.class)
public class MockTest {

    private SimpleClass thing;

    @Before
    public void setup() {

        thing = new SimpleClass();
    }

    @Test
    public void whenMethodsHaveSimilarSignatures() {

        when(thing.doWork(anyString(), anyString())).thenReturn(true);
        when(thing.doWork(any(Integer.class), anyString())).thenReturn(false);

        assertThat(thing.doWork("one", "name")).isTrue();
        assertThat(thing.doWork(1, "name")).isFalse();
    }
}

虽然我不是Mockito的巫师,但我已经使用它一段时间了,从来没有遇到过这个问题。思想?我用的是Mockito Core v2。2.9

共有1个答案

常哲彦
2023-03-14

在存根重载方法时不应使用any(Object.class),因为StringInteger都是Object的子类,所以在存根期间指定特定的参数。您还可以使用ArgumentMatchers

when(thing.doWork(ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(true);
when(thing.doWork(ArgumentMatchers.any(Integer.class), anyString())).thenReturn(false);

而且你也不是在嘲笑SimpleClass

@RunWith(MockitoJUnitRunner.class)
public class MockTest {

private SimpleClass thing = Mockito.mock(SimpleClass.Class);

@Before
public void setup() {

    MockitoAnnotations.initMocks(this);  // need to enable these annotations programmatically
}

@Test
public void whenMethodsHaveSimilarSignatures() {

    when(thing.doWork(anyString(), anyString())).thenReturn(true);
    when(thing.doWork(any(Integer.class), anyString())).thenReturn(false);

 //or

   when(thing.doWork(ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(true);
   when(thing.doWork(ArgumentMatchers.any(Integer.class), anyString())).thenReturn(false);

    assertThat(thing.doWork("one", "name")).isTrue();
    assertThat(thing.doWork(1, "name")).isFalse();
    }
 }
 类似资料:
  • 我有一个采访问题-C#,是否可以在一个类中实现,从接口继承有两个具有相同名称和相同签名的方法?

  • 在JLS 8第8.4.8.1节中,有一条声明: 在某些参数化下,泛型超类C中的具体方法可以与该类中的抽象方法具有相同的签名。在这种情况下,具体方法是继承的,而抽象方法不是。然后应将继承的方法视为覆盖其来自C的抽象对等体。 有人能为泛型类提供这种参数化的例子吗?我不能。

  • 问题内容: 让我们创建两个列表: 出: 我创建了两个独立的列表,输出显示了两个不同的内存地址。这不足为奇。但是,现在让我们在没有分配的情况下做同样的事情: 出: 还有第二次: 出: 我不确定如何解释这一点。为什么这两个未命名列表具有相同的内存地址? 问题答案: 从文档: 返回对象的“身份”。这是一个整数,可以保证在此对象的生存期内唯一且恒定。 具有不重叠生存期的两个对象可能具有相同的id()值。

  • 但我的问题是,当我从Eclipse导出项目以生成签名apk时,它不允许使用现有的密钥库;此外,当我选择existing keystore时,别名的下拉列表为空。所以每次我都要创建新的密钥库。在选择退出密钥存储时,它还显示“无效密钥存储格式”。请提供我的一些解决方案,以我如何生成一个APK与相同的SHA-1密钥。

  • 我在一次面试中被问到以下问题: 问题:名称和签名相同但返回类型不同的方法。他问我,可能吗?这种类型叫什么。 有人能告诉我以下情况吗: > 上面的事情在任何情况下都是可能的(至少像一个在基类中,一个在派生类中?)如果是,是什么类型?比如编译或运行时多态? 在编译时多态性中,如果方法的返回类型与签名也不同,该怎么办?但只有函数的名称是相同的。还是编译时多态性吗? 在重写中,如果我有不同的返回类型,但方

  • 我说的是Java,但这个概念也适用于其他语言-- 我们在同一个类上有两个方法,它们具有相同的基本功能,但提供不同的返回类型。这两种方法都会给你所有的东西,但一个得到一个可以提供对所有东西的访问的可迭代的,一个得到一个包含所有东西的集合。 我们知道你不能这样做(因为它不会编译): 那么,有人想过如何命名这些方法吗?这似乎是一个简单的解决方法: 然而,这显然有些冗长,可能不是最好的解决方案。我问的这个