2012-08-28 49 views
1

說我有下面的代碼:測試本地作用域與對象的Mockito不重構

public class ClassToTest 
{ 
    AnotherClass anotherClass; 

    public void methodToTest(int x, int y) 
    { 
     int z = x + y 
     anotherClass.receiveSomething(z); 
    } 
} 

public class AnotherClass 
{ 
    public void receiveSomething(int z) {.. do something.. } 
} 

我想要的變量z的價值主張。我如何在不重構的情況下做到這一點?變量x,y和z可以是其他一些Java類的類型,爲簡單起見,我只使用了「int」。

回答

3

您可以編寫以下內容。 當然依賴注入和測試方法可能會根據您當前的實現和/或您的測試場景而改變。

@RunWith(MockitoJUnitRunner.class) 
public class ClassToTestTest { 

    @Mock AnotherClass anotherClass; 
    @InjectMocks ClassToTest classToTest; 

    @Test public void ensure_that_value___Z___is_passed_to___AnotherClass() { 
     classToTest.methodToTest(1, 2); 

     verify(anotherClass).receiveSomething(eq(3)); 
    } 
} 

編寫時都考慮1.9.5的Mockito-RC1。

而且(在對象的情況下),而不是使用eq匹配,則可以改爲使用ArgumentCaptor,其將捕獲的值或值的引用。您將能夠對捕獲的值執行額外的斷言。例如使用Truth或FEST-Assert。

這可能是這樣的:

@RunWith(MockitoJUnitRunner.class) 
public class ClassToTestTest { 

    ... 
    @Captor ArgumentCaptor<List<Z>> listCaptor 

    @Test public void ensure_that_list_with_value___Z___is_passed_to___AnotherClass() { 
     // given 

     // when 
     ... 

     // then 
     verify(anotherClass).receiveList(listCaptor.capture()); 
     assertThat(listCaptor.getValue()).contains(Z); 
    } 
} 

乾杯,

+0

感謝。如果我想檢查z的屬性,如果z是一些java類的呢?說,我可能有一些邏輯,而不僅僅是一個簡單的比較。 – supertonsky

+0

@supertonsky是的我想我錯過了第一個答案,我只是編輯它來填補關於具體斷言的缺失的東西:) – Brice