2013-03-20 1222 views
2

我有一些静态方法来模拟使用Mockito + PowerMock。一切都是正确的,直到我试图嘲讽只抛出异常的静态方法(并且别无其他)。PowerMockito模拟静态方法引发异常

我的测试类是这样的:

顶部:

@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静态调用工作正常(如果我注释掉第三个),但最后一个(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中。现在一切正常。

+0

目前尚不清楚您是否想要模拟某种方法来抛出异常,或者在模拟方法时遇到异常。而且关于JPA的最后一点似乎并不适合任何地方,或者至少让我很困惑。 – 2013-03-20 12:47:28

+0

你已经在嘲笑它。所以它不会调用抛出异常的真实方法 – 2013-03-20 17:33:53

回答

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

查看文档在这里:

+0

第一个链接已过期。 – 2017-07-31 15:41:31

+0

我更新了这两个链接。 – 2017-08-11 14:42:54

相关问题