验证是否使用mockito调用了三个方法之一

发布于 2024-10-30 21:32:21 字数 570 浏览 4 评论 0原文

我有这样的三个方法:

public void method1(String str){
    ...
}

public void method1(String str, String str2, String str3){
    ...
}

public void method1(String str, String str2, Object[] objs, String str3){
    ...
}

我想在 Mockito 中检查是否调用了这些方法中的任何一个,因此我尝试使用 anyVararg Matcher:

verify(foo).method1(anyVararg());

但这不会编译“类型中的方法 method1(String, String)”错误不适用于参数(对象)”

我有两个问题:

  1. 我该如何解决这个问题?
  2. 有没有办法检查是否调用了两个方法中的任何一个?想象一下我有另一种方法,称为方法 2 和方法 3。我想检查是否调用了其中任何一个(但至少有一个)。

谢谢。

I have three methods like these ones:

public void method1(String str){
    ...
}

public void method1(String str, String str2, String str3){
    ...
}

public void method1(String str, String str2, Object[] objs, String str3){
    ...
}

I want to check in Mockito if any of these methods are invoked, so I've tried to use anyVararg Matcher:

verify(foo).method1(anyVararg());

but this doesn't compile "The method method1(String, String) in the type Errors is not applicable for the arguments (Object)"

I have two questions:

  1. How can I solve this?
  2. Is there any way to check if any of two methods are invoked? Imagine I have another mathods called method2 and method3. I'd like to check if any of them is invoked (but at least one).

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

你的往事 2024-11-06 21:32:21

您可以通过使用 Answer 在调用任何方法时增加计数器来实现此目的。

private Answer incrementCounter = new Answer() {
    public Object answer(InvocationOnMock invocation) throws Throwable {
        counter++;
        return null;
    }        
};

请注意,您需要存根所有方法。方法的唯一性基于其签名,而不仅仅是方法名称。两个同名的方法仍然是两个不同的方法。

doAnswer(incrementCounter).when(mockObj.method1(anyString()));
doAnswer(incrementCounter).when(mockObj.method1(anyString(), anyString()));
doAnswer(incrementCounter).when(mockObj.method2(anyString()));

请参阅 doAnswer 文档此处< /a>.

You could do this by using an Answer to increment a counter if any of the methods are called.

private Answer incrementCounter = new Answer() {
    public Object answer(InvocationOnMock invocation) throws Throwable {
        counter++;
        return null;
    }        
};

Note that you need to stub all methods. A method's uniqueness is based on its signature and not just the method name. Two methods with the same name are still two different methods.

doAnswer(incrementCounter).when(mockObj.method1(anyString()));
doAnswer(incrementCounter).when(mockObj.method1(anyString(), anyString()));
doAnswer(incrementCounter).when(mockObj.method2(anyString()));

See documentation for doAnswer here.

牵你手 2024-11-06 21:32:21

可变参数方法具有如下签名:

public void myMethod(String ... arguments){}

没有一个方法是可变参数方法。

我不了解 Mockito,所以我无法为您解决您的问题,但是除非您使用反射,否则不可能对上述所有三种方法进行抽象,所以我想您将不得不对上述每种方法使用单独的情况方法。

A vararg method has a signature like this:

public void myMethod(String ... arguments){}

None of your methods is a vararg method.

I don't know Mockito so I can't solve your problem for you, but there is no possible abstraction over all three of the above methods unless you use reflection, so I guess you will have to use separate cases for each of the above methods.

没有伤那来痛 2024-11-06 21:32:21

您可以拦截对对象的所有调用,如下答案所示:
Mockito - 拦截模拟上的任何方法调用
然后将其与@Bozho建议的方法结合起来:

private Answer incrementCounter = new Answer() {
    public Object answer(InvocationOnMock invocation) throws Throwable {
        if (invocation.getMethod().getName().eqauls("someMethid")) {
            counter++;
        }
        return null;
    }        
};

VendorObject mockObj = mock(SomeClass.class, incrementCounter);

注意:如果您为任何此方法提供其他拦截器 - 默认将不会被调用。

You can intercept all calls on object like in this answer:
Mockito - intercept any method invocation on a mock
and then put combine this with approach suggested by @Bozho:

private Answer incrementCounter = new Answer() {
    public Object answer(InvocationOnMock invocation) throws Throwable {
        if (invocation.getMethod().getName().eqauls("someMethid")) {
            counter++;
        }
        return null;
    }        
};

VendorObject mockObj = mock(SomeClass.class, incrementCounter);

Note: if you provide other interceptor for any of this methods - default will not be invoked.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文