Mockito验证返回错误“参数匹配器的无效使用!预期有1个匹配器,已记录3个”

时间:2019-08-27 22:18:45

标签: spring spring-mvc junit mockito

Class结构如下:

Class A{
    private B b;

    public void methodA(int x, String y, String z){
        if methodB(int x, String y, methodC(String z)){
            // do stuff
        } else {
            //do stuff
        }
    }

    public boolean methodB(int p, String q, int r){
        //do stuff
        return c; //boolean
    }

    public Integer methodC(String x){
        // do stuff
        return y; //Integer
    }
}

我正在为methodA编写单元测试,并希望确保methodB仅被调用一次。

我尝试为此使用Mockito。

public class TestModule{
    @Mock
    B b;

    @InjectMocks
    A a;

    @Before
    Public void setup(){
        MockitoAnnotations.initMocks(this);
    }

    // other tests

    @Test
    public void testMethodA(){
        Mockito.when(a.methodB(Mockito.anyInt(), Mockito.anyString(), Mockito.anyInt())).thenReturn(Mockito.anyBoolean());
        verify(a, times(1)).methodB(Mockito.anyInt(), Mockito.anyString(), Mockito.anyInt());
    } 
} 

我遇到一个错误: 无效使用参数匹配器! 预计有1个符合条件的记录,有3个记录:     指向代码行“ Mockito.when ...”三遍。

我不太确定怎么回事。请帮我弄清楚。还有,我想念的是更好或更简单的方法吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

我认为您通常误解了模仿工具的使用。

  • 我假设您想测试真正的A类(尤其是methodA的行为),但是...

    您从不称呼它(测试术语为锻炼)。 相反,您错误地使用了用于 stubbing 方法的@import "bootstrap-sass/bootstrap"; @import 'bootstrap/dist/css/bootstrap.min.css'; .wrapper-card-1{ @extend .card; @extend .card-body; @extend .card-complete-transparent; .card-heading{ @extend .card-title; @extend .bold; } .card-para{ @extend .card-text; @extend .para; } .card-button{ @extend .btn; @extend .btn-primary; @extend .no-border; @extend .bold; @extend .color-blue; } .card-image{ @extend .card-img-top; } } 方法。

  • 我不了解Mockito.when属性的含义。您将其模拟版本注入到A中,但是...您从未使用过它。

  • 让我强调,对内部方法的调用通常不应进行测试(仅对对外部方法的调用进行验证)。

  • 通常您检查(b)被模仿对象的行为

  • 如果要检查真实对象,必须监视

    因此,检查实际SUT对象的内部调用的(不太有趣)问题的可能解决方案是:

    Mockito.verify()