[英]Using both junit assertions and mockito verification
我將Junit與Mockito結合使用。 我使用了Mockito的verify方法+ junit斷言來完成驗證。 這是不可取的嗎? 我們應該使用其中一個,但不能同時使用兩者?
兩者都沒錯。
Mockito的verify
用於斷言在給定模擬中調用了一個方法(帶有預期的參數)。
JUnit的assertXYZ
用於斷言某些結果具有預期值。
兩者都是有效的驗證,如果兩者都相關,則都應使用。
例如,考慮以下(公認的人為)情況:
您具有執行一些數學計算的接口:
public interface ValueProducer {
public int getValue(int val);
}
一個將其產生的任何結果加倍的類:
public class Doubler {
public static int doubleThatResult (ValueProducer producer, int val) {
return 2 * producer.getValue(val);
}
}
測試它需要聲明兩件事:
getValue
因此,例如:
public class DoublerTest {
@Test
public void testDoubleThatResult() throws Exception {
int value = 7; // Or any other value
int returnMock = 13; // Or any other value
ValueProducer producerMock = mock(ValueProducer.class);
when(producerMock.getValue(value)).thenReturn(returnMock);
int actual = Doubler.doubleThatResult(producerMock, value);
verify(producerMock);
assertEquals(26, actual);
}
}
Mureinik的答案是絕對正確的-斷言和驗證是相輔相成的,並且可以很好地協同工作-但對單個行為執行兩項操作可能是多余的。
通常,目標是以最靈活且與實現無關的方式表示測試。 從這種意義上講,狀態測試(帶有斷言)通常是最合適的選擇:只要結果狀態正確,調用哪種方法都沒有關系。 Mockito驗證雖然可能,但可能會帶來脆性(代碼行為正確,但測試已失敗)。 Mockito本身會在verify(T)
的Javadoc和Mockito的創建者Szczepan Faber的鏈接文章中對此進行警告。
這種冗余肯定不是最壞的事情:它確實測試了系統的屬性,並且可能是在測試與敏感的,遺留的,第三方的或頻繁變化的依賴關系的交互中值得進行的工作。 但是,如果交互作用不重要,則這些額外的驗證可能會犧牲脆性。
在其他時候,確認正確的行為意味着測試副作用,例如,確保調用了someSystem.reset()
,或者通過驗證未調用提供程序來測試緩存。 這些是驗證的完美示例,因為與外部服務的交互是關鍵的可測試行為。 在某些情況下,Mockito驗證是做出正確斷言的唯一方法。
許多測試用例是上述情況的組合,因此可以隨意自由使用聲明和驗證。 請記住,狀態測試通常是足夠且可取的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.