当前位置: 首页 > 面试题库 >

如何验证使用Mockito调用了两种方法之一?

伯逸明
2023-03-14
问题内容

假设我有一个带有两个我不在乎的方法的类,这称为…

public class Foo {
    public String getProperty(String key) {
        return getProperty(key, null);
    }
    public String getProperty(String key, String defaultValue) {
        //...
    }
}

下面的两个(仍然来自我的应用程序中的另一个类)都应该通过我的测试:

public void thisShouldPass(String key) {
    // ...
    String theValue = foo.getProperty(key, "blah");
    // ...
}

public void thisShouldAlsoPass(String key) {
    // ...
    String theValue = foo.getProperty(key);
    if (theValue == null) {
        theValue = "blah";
    }
    // ...
}

我不在乎哪个被调用,我只想调用两个变体之一。

在Mockito中,我通常可以执行以下操作:

Mockito.verify(foo, atLeastOnce()).getProperty(anyString());

要么:

Mockito.verify(foo, atLeastOnce()).getProperty(anyString(), anyString());

是否有一种本地方式说“验证 一个或另一个 至少发生一次”?

还是我必须做一些粗略的事情:

try {
    Mockito.verify(foo, atLeastOnce()).getProperty(anyString());
} catch (AssertionError e) {
    Mockito.verify(foo, atLeastOnce()).getProperty(anyString(), anyString());
}

问题答案:

您可以atLeast(0)结合使用ArgumentCaptor

ArgumentCaptor<String> propertyKeyCaptor = ArgumentCaptor.forClass(String.class);
Mockito.verify(foo, atLeast(0)).getProperty(propertyKeyCaptor.capture(), anyString());

ArgumentCaptor<String> propertyKeyCaptor2 = ArgumentCaptor.forClass(String.class);
Mockito.verify(foo, atLeast(0)).getProperty(propertyKeyCaptor2.capture());

List<String> propertyKeyValues = propertyKeyCaptor.getAllValues();
List<String> propertyKeyValues2 = propertyKeyCaptor2.getAllValues();

assertTrue(!propertyKeyValues.isEmpty() || !propertyKeyValues2.isEmpty()); //JUnit assert -- modify for whatever testing framework you're using


 类似资料:
  • 但这将返回以下错误: org.mockito.exceptions.misusing.NotaMockException: 传递给verify()的参数类型为$proxy4,不是mock!

  • 问题内容: 我正在使用以下内容。 这是我的utils课 这是被测课程的要点: 这是测试: 以上测试失败。给出的验证模式为空,但根据代码,如果订购成功,则必须发送电子邮件。 问题答案: 如果您要嘲笑行为(类似),则实际上无需调用。也就是说,这是我重写测试方法的动力: 我分为四个部分,以更好地突出显示正在发生的事情: 1.变量 我选择在此处声明任何实例变量/方法参数/模拟协作者。如果它在多个测试中使用

  • 问题内容: 我正在使用Mockito用Java编写单元测试,并且我想验证某种方法是在对象 上 调用的 最后一个 方法。 我在被测试的代码中正在做这样的事情: 在我的模拟中,我不在乎编辑行中所有内容的顺序,但是非常重要的是,保存后 不要 尝试对其进行任何其他操作。有什么好方法吗? 请注意,我不是在寻找verifyNoMoreInteractions:它不会确认saveToDatabase是最后调用的

  • 我正在Junit上工作 这就是我所做的。我已发出请求,并且我的请求已成功调用我的控制器。当我尝试使用要测试是否调用了静态方法,我得到一个错误,如下所示。 我得到的错误是: 我的问题是: > 我可以使用在我的方法。如果"是"如何? 我还想在上使用验证。我该怎么做呢? 任何帮助都是值得赞赏的。

  • 我试图验证在使用powerMockito 1.6.4测试服务方法时从未调用过静态方法 我按照这个答案做了同样的事情。 以下是我的代码。 我现在面临的问题是,调用real并给出nullPointerException。 我的假设是与一起工作,以便指定要验证的静态方法。 我错过什么了吗?

  • 我在类中有一个签名为的方法。 我有一个调用方法的代码块: 如果我想测试databaseService.save(user)没有被调用,那么我如何用Mockito(3.3.3版)来做呢?