2013-03-20 108 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

相關問題