【问题标题】:PowerMockito mock static method which throws exception引发异常的 PowerMockito 模拟静态方法
【发布时间】:2013-03-09 08:49:13
【问题描述】:

我有一些静态方法可以使用 Mockito + PowerMock 进行模拟。一切都是正确的,直到我尝试模拟一个只抛出异常(并且什么都不做)的静态方法。

我的测试类如下所示:

顶部:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Secure.class, User.class, StringUtils.class})

正文:

    PowerMockito.mockStatic(Secure.class);
    Mockito.when(Secure.getCurrentUser()).thenReturn(user);

    PowerMockito.mockStatic(StringUtils.class);
    Mockito.when(StringUtils.isNullOrEmpty("whatever")).thenReturn(true);

    PowerMockito.mockStatic(User.class);
    Mockito.when(User.findById(1L)).thenReturn(user); // exception !! ;(

    boolean actualResult = service.changePassword();

而changePassword方法是:

  Long id = Secure.getCurrentUser().id;

  boolean is = StringUtils.isNullOrEmpty("whatever");

  User user = User.findById(1L);
  // ...

前 2 个静态调用工作正常(如果我注释掉第 3 个),但最后一个( User.findById(long id) )在“Mockito.when”方法中调用时抛出异常。这个方法看起来像这样:

 public static <T extends JPABase> T findById(Object id) {
        throw new UnsupportedOperationException("Please annotate your JPA model with @javax.persistence.Entity annotation.");
    }

我的问题是如何模拟这种方法以获得我期望的结果? 感谢您的帮助。


编辑:

感谢所有回复。我找到了解决方案。我试图模拟一个方法 findById,它不是直接在 User.class 中,而是在 User 扩展的 GenericModel.class 中。现在一切正常。

【问题讨论】:

  • 不清楚是要模拟方法抛出异常还是模拟方法时遇到异常。此外,关于 JPA 的最后一点似乎不适合任何地方,或者至少它让我很困惑。
  • 你已经在嘲笑它了。所以它不会调用真正抛出异常的方法

标签: java testing mocking mockito powermock


【解决方案1】:

尝试改变这个:

PowerMockito.mockStatic(User.class);
Mockito.when(User.findById(1L)).thenReturn(user);

到这里:

PowerMockito.mockStatic(User.class);
PowerMockito.doReturn(user).when(User.class, "findById", Mockito.eq(1L));

在此处查看文档:

【讨论】:

  • 第一个链接已过期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
相关资源
最近更新 更多