2012-08-23 29 views
12

我正在使用Mockito进行JUnit测试。 因此,有是从我想要的代码用于检验一个给定的A类:Mockito:当方法A.a被调用,然后执行B.b

class A{ 

    public A(){} 

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

} 

,我想用相同的参数和相同类型的返回值的另一种方法调用替换方法调用A.A。正如你所看到的,它不可能通过扩展类,因为它是最终的。所以我现在是用方法B.b另一个类B:

class B{ 

    public B(){} 

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

} 

现在我想知道什么时候A.A从代码调用每次做,B.b的返回值来代替。是否有可能通过Mockito(如Mockito.when(A.a(x)).thenReturn(B.b(x));)实现此目的,但是使用相同的参数x,但不知道x的值?

任何帮助将不胜感激,先谢谢您!

+2

你想测试什么情况?为什么A.a()是最终的?以及为什么要替换A.a()?的调用?根据我的理解,你想覆盖A.a(),对吗? – Adelin

+1

我正在测试Android库项目(我也使用Robolectric,以便能够测试Android项目)。在这种特殊情况下,我想测试一个数据库。代码调用内容解析器,内容提供者在AndroidManifest.xml中定义,我还没有找到一种方法来设置内容提供程序的编程方式,因为它在运行测试时并未从xml加载。所以我希望代码调用内容提供者而不是内容解析器。 – user1448982

回答

4

根据​​,无法覆盖Mockito生成的模拟的最终方法。但是您可以使用Powermock在运行时破解代码,以便Mockito可以完成其工作。

+2

这会解决'最终'问题,@ brice的答案会回答你原来问题的要点。 – jhericks

18

好的mockito嘲笑通过扩展课程和覆盖方法的工作,在你的情况是不可能在A.a(String)。如果你想要发生这种情况,你必须删除最后一个修饰符。

现在假设A.a(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); 
     } 
    }; 
} 

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

干杯

+0

谢谢,但它不是我的解决方案,因为我无法删除最终修饰符。这是Android SDK的一些代码。 – user1448982

+3

@ sergej-zagursky有解决最终修饰符问题的答案,但是这个答案可以回答你原来问题的要点。这就是你如何将你的返回值作为'x'的值。 – jhericks

+0

如何导入“给定”? – neves

1

基本上我把你的设置,并写了一个单元测试。什么弹出首先是一条错误消息,明确说明这一点:

org.mockito.exceptions.misusing.MissingMethodInvocationException: ()时,要求其必须是“在一个模拟的一个方法调用的参数。

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

所以根据Mockito,你不能残缺最后的方法,就是这样。

编辑:所以你必须删除最后一个修饰符,或者,如果你坚持这个类的话,找到另一个方法。

相关问题