2013-06-01 45 views
2

我對Mockito有疑問。 我將要測試的這款簡單的類:mockito的疑問

public class MyClass{ 
    private UserService userService; 
    public void deleteUser(){ 
     userService.getAdminUser(1); 
     userService.deleteUser(0); 
    } 
} 

我寫了這個簡單的測試:

@RunWith(MockitoJUnitRunner.class) 
    public class MyClassTest { 
     @MockitoAnnotations.Mock 
     private UserService userService; 

     @Test 
     public void test(){ 
      MyClass myClass=new MyClass(); 
      myClass.userService=userService; 
      myClass.deleteUser(); 
     } 
    } 

此試運行沒有任何錯誤。 我等待它沒有編譯,因爲沒有任何調用userService方法..

+0

\ @ MockitoAnnotations.Mock已被棄用,只是使用\ @Mock –

+0

任何人知道如何在評論中逃避@標誌,所以SO不認爲我正在將我的評論引導給某人? –

+0

@TomMcIntyre如果您在單詞或表達式附近使用反引號,它會被內聯和格式化,例如, '@ Mock',請在撰寫評論時查看幫助鏈接。 – matsev

回答

0

您還沒有添加任何檢查,看看是否以任何方式使用userService。添加一個驗證會爲你做到這一點:When to use Mockito.verify()?

我會建議你閱讀關於Mockito如何在測試中工作,我認爲你已經跳過了一些基本知識,當談到學習設計和方法如何調用模擬被處理。

3

Mockito創建的嘲笑是「聰明的」。當一個無效方法被調用時,他們不會做任何事情。當一個返回對象的方法被調用時它們返回null。當調用返回集合的方法時,它們會返回一個空集合。

如果要驗證getAdminUser()deleteUser()已被調用,請使用Mockito.verify()

這兩件事情都在Mockito documentation解釋,點1和2,具體爲:

默認情況下,返回值,模擬返回null,一個空的集合或適當的原始/原始包裝的所有方法值(例如:0,false,...用於int/Integer,布爾值/布爾值,...)。

0

下面介紹如何使用不同註解的不同方法對其進行測試。請注意,這是TestNG的,但它適應的JUnit 4+很簡單:

import static org.mockito.Mockito.*; 

public final class Test 
{ 
    private UserService userService; 

    @BeforeMethod 
    public void init() 
    { 
     userService = mock(UserService.class); 
    } 

    @Test 
    { 
     final MyClass myClass = new MyClass(); 
     myClass.userService = userService; 
     myClass.deleteUser(); 
     verify(userService, times(1)).getAdminUser(1); 
     verify(userService, times(1)).deleteUser(0); 
    } 
} 

請注意,有一個參數的唯一verify()變種,這是完全等同於具有times(1)作爲第二個參數。還有never()

例如如果你想測試該.deleteUser()方法不叫任何參數,你會怎麼做:

verify(userService, never()).deleteUser(anyInt());