PowerMockito模拟静态方法,它抛出异常

时间:2013-03-20 10:05:51

标签: java testing mocking mockito powermock

我有一些使用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中,而是在GenericModel.class中,用户扩展。现在一切都很完美。

1 个答案:

答案 0 :(得分:2)

尝试更改此内容:

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));

请参阅此处的文档: