2016-02-18 25 views
0

我在Java世界的新手,但它是很難理解爲什麼不是我能存根嘲笑對象的方法...的Mockito - 不可能磕碰嘲笑對象

@RunWith(MockitoJUnitRunner.class) 
public class ChildBLLIT extends BaseInteractorIT { 

    @InjectMocks 
    private ChildBLL ChildBLL = Mockito.mock(ChildBLL.class); 

    @Before 
    public void setUp() { 
    ChildBLL.engine = engineMock; 
    } 

    /** 
    * Test of getZipStatistics method, of class ChildBLL. 
    */ 
    @Test 
    public void testGetZipStatistics() { 
    final String testZipStatisticsText = "DummyZipStatistics"; 
    //This method will throw the null pointer exception 
    when(ChildBLL.engine.getZIPStatistics()).thenReturn(testZipStatisticsText); 


    ChildBLL.getZipStatistics(); 
    verify(ChildBLL.engine).getZIPStatistics(); 
    } 

} 

當我試圖存根getZIPStatistics( )方法我總是得到一個空指針異常,當然我得到了,因爲在getZIPStatistics()方法中有一個私有對象,它沒有被模擬...在我看來,Mockito不會嘲笑私有域...不幸的是這是從另一個項目:

public class BaseIT { 

    @Mock 
    protected static FromOtherProject engineMock; 

    @Before 
    public void initMocks() { 
    MockitoAnnotations.initMocks(this); 
    } 
} 

在這裏我嘲笑引擎變量,但那麼我怎樣才能模擬/存根getZIPStatistics()方法?這是這種方法:

public class FromOtherProject { 
    //... 
    public final String getZIPStatistics() { 
     return ZIPStatistics.toString(); 
    } 
} 

我該怎麼辦?

回答

1

讓我們假設一個簡單的類...

public class Account { 

    public String getPassword() { 
     return "abc"; 
    } 
} 

...幷包含它簡單的類...

public class AccountHolder { 
    private Account account; 

    public String getAccountPassword() { 
     return this.account.getPassword(); 
    } 

} 

所以現在我們有基於所有賬戶的簡單基類測試...

public class AccountBasedTest { 

    @Mock 
    protected Account account; 

} 

...和實際測試賬號所有人一類...

@RunWith(MockitoJUnitRunner.class) 
public class AccountHolderTest extends AccountBasedTest { 

    @InjectMocks 
    private AccountHolder accountHolder; 

    @Test 
    public void getAccountPasswort_must_return_account_password() { 
     Mockito.when(this.account.getPassword()).thenReturn ("xyz"); 

     Assert.assertEquals("xyz", this.accountHolder.getAccountPassword()); 
    } 

} 

而就是這樣。 @InjectMocks等註釋也會在超類中查找,因此您可以獲取您的模擬帳戶,並將該帳戶存入您的AccountHolder。無需致電MockitoAnnotations.initMocks。它不應該傷害,但它不是必需的,因爲您已經在使用MockitoJUnitRunner,這確實如此。