【问题标题】:Mock objects calling final classes static methods with Mockito使用 Mockito 调用最终类静态方法的模拟对象
【发布时间】:2013-06-09 14:58:31
【问题描述】:

我刚刚开始模拟我们应用程序的不同层。我的一个模拟对象在调用最终类静态方法时返回 NPE。有没有办法解决这个问题?

例如

when(mockObject.someMethod(FinalClass.staticMethod(someParam)).anotherMethodCall)
    .thenReturn("someString");

【问题讨论】:

  • Mockito 一般不能模拟最终方法;但是,我怀疑即使删除 final 也会有所帮助......
  • 不可能用 mockito 来模拟 final 类或 statis 方法。虽然,我认为你可以用 power mock 做到这一点。也许你可以看看code.google.com/p/powermock
  • 对不起,由于混乱,我已经更新了我的代码 sn-p。请检查一下

标签: java unit-testing junit mockito


【解决方案1】:

你必须同时使用 PowerMock 和 Mockito。

我不明白你的代码 sn-p 试图做什么,但是下面的 sn-ps 允许 Calendar 类的静态 getInstance() 方法返回一个模拟的 Calendar 对象。也许这会给你指明正确的方向

在班级层面:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Calendar.class)
public class XXXXXX {

在你的测试方法中:

PowerMockito.mockStatic(Calendar.class);
    Calendar calendar = mock(Calendar.class);
    when(calendar.get(eq(Calendar.HOUR_OF_DAY))).thenReturn(3);

    Mockito.when(Calendar.getInstance()).thenReturn(calendar);

【讨论】:

  • 如果我的班级用@RunWith(Theories.class)注解了怎么办?
【解决方案2】:

Mockito 不支持模拟最终类。请查看PowerMock。它允许您模拟静态方法和类。它可以与 Mockito 一起使用,documentation 解释了如何做到这一点。

【讨论】:

  • 没关系,Mockito 不能模拟 Final 类
  • 所以你的意思是它在模拟最后一堂课?我以为它只是调用最终类的静态方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 2014-02-02
相关资源
最近更新 更多