2014-03-01 102 views
2

場景:Mockito根據一種方法返回所有類的實例返回值

我正在使用獨立安裝測試Spring MVC控制器。

控制器從請求中的JSON對象獲取參數。它在將JSON對象轉換爲java對象後調用服務。服務使用JPA將其保存到數據庫,然後更新實體的Id字段並返回控制器。將實體轉換爲JSON後,控制器將JSON響應返回給調用者。

我已經在我的測試類嘲笑服務,並注入到控制器使用@InjectMocks

嘲笑的服務必須在JPA實體的私有SETID方法不能訪問,因爲它是由Hibernate在真實的情景填充。

現在,當我嘲笑服務,我如何存根創建實體的getId方法?

代碼來測試mockservice:

@Test 
public void thatAccountCreationRendersAsJson() throws Exception { 

    doAnswer(new Answer<Boolean>() { 
     @Override 
    public Boolean answer(InvocationOnMock invocationOnMock) throws Throwable { 
    Account account = (Account) invocationOnMock.getArguments()[0]; 
    account.setEnabled(true); 
    account.setFirstName("bca123"); 
     return Boolean.TRUE; 
    } 
    }).when(mockAccountService).registerAccount(any(Account.class), 
      anyString(), any(BindingResult.class)); 

現在如何存根賬戶類的getId方法,以便控制器給出標識的JSON響應。

我無法創建一個模擬帳戶對象,因爲它是由控制器從JSON創建併發送到模擬服務。我的模擬賬戶對象沒有使用。

我試圖在上述doAnswer方法使用

Account spier = spy(account); 
doReturn(new Long(22)).when(spier).getId(); 
spier.setFirstName("cba123"); 

但它不是有效的。

有沒有什麼辦法可以爲任何實例的Account.class的getId方法的所有調用返回22的常量值?

http://code.google.com/p/mockito-python/wiki/Stubbing給出了部分 實例,類級別和靜態方法
這正好符合我的需要,他們存根實例方法的所有實例 但它是蟒蛇。

感謝您回答我的問題。

+0

是的,我們可以做到這一點,並完成測試和功能。但是我們更關心的是,我們如何能夠像Python中的mockito那樣做一些事情。在類級別存根方法,以便它適用於創建的類的所有實例。謝謝。 – user2980548

回答

1

公開您的setId()方法,並添加account.setId(whatever)setId()方法沒有真正的私有理由。僅僅因爲Hibernate可以設置私有字段並不意味着你不應該有一個公共setter,特別是如果它是你的測試需要的話。如果你真的想保持私密性,那麼就像Hibernate一樣,使用反射來設置它。但我不會那樣做。

0

我已經將此測試移至集成測試,因爲我有完整的彈簧容器以及內存數據庫以通過休眠設置ID。

Vam