的Mockito:当方法AA被称为然后执行了Bb(Mockito: when Method A.a

2019-06-27 07:30发布

我使用了的Mockito JUnit测试。 因此,有是从我想测试代码中使用一个给定的A类:

class A{

    public A(){}

    public final String a(String x){
        return "A.a: " + x;
    }

}

我想用相同的参数和相同类型的返回值的另一种方法调用替换方法调用AA级。 正如你所看到的,它不可能通过,因为它是最后的扩展类中重写的方法。 所以我现在是用BB的方法,另一种B类:

class B{

    public B(){}

    public String b(String x){
        return "B.b: " + x;
    }

}

现在,我要确保每次当AA是从代码调用的时候,BB的返回值来代替。 是否有可能与对的Mockito实现这一目标(像Mockito.when(Aa(x)).thenReturn(Bb(x)); ),但具有相同的参数x,不知道x的值?

任何帮助,将不胜感激,谢谢提前!

Answer 1:

这是不可能来覆盖的Mockito生成嘲笑最终方法,根据的Mockito限制 。 但是你可以使用Powermock在运行破解代码,以便可以的Mockito做它的工作。



Answer 2:

那么通过的Mockito扩展类并覆盖方法,而你的情况是不可能的嘲笑作品Aa(String) 。 如果您希望这种情况发生,你必须去掉final修饰符。

现在假定Aa(String)不是终点,你问什么是完全的Mockito可行的:

given(mockA.a(anyString()).willAnswer(returnOfB(bInstance));

Answer<String> returnOfB(final B bInstance) {
    return new Answer<String>() {
         public String answer(Invocation invocation) {
             String arg = (String) invocation.getActualArguments()[0];
             return bInstance.b(arg);
         }
    };
}

请注意,这个答案已经写在手机上,并可能有错字,错的名字,但你应该得到的应该做些什么来实现你想要什么的想法。

干杯



Answer 3:

基本上,我把你的设置和写了单元测试它。 什么弹出第一个问题是明确指出此错误消息:

org.mockito.exceptions.misusing.MissingMethodInvocationException:当()要求它必须是“上一个模拟一方法调用的参数。

后来在跟踪它指出:“你存根任:最后/私营/ equals()方法/ hashCode()方法这些方法不能存根/验证。”

所以要根据您的Mockito不能存根最终方法,就是这样。

编辑:所以,你必须要么删除final修饰符,或在情况下,你坚持这个类,因为它是发现它周围的另一种方式。



文章来源: Mockito: when Method A.a is called then execute B.b