簡體   English   中英

使用Mockito驗證方法后沒有調用任何內容

[英]Use Mockito to verify that nothing is called after a method

我正在使用Mockito在Java中編寫單元測試,我想驗證某個方法是最后一個調用對象的方法。

我正在測試的代碼中做這樣的事情:

row.setSomething(value);
row.setSomethingElse(anotherValue);
row.editABunchMoreStuff();
row.saveToDatabase();

在我的模擬中,我並不關心我在行上編輯所有內容的順序,但是在我保存之后我不再嘗試做任何事情是非常重要的。 有沒有辦法做到這一點?

請注意,我不是在尋找verifyNoMoreInteractions:它不會確認saveToDatabase是最后調用的東西,如果我在沒有顯式驗證的行上調用任何內容,它也會失敗。 我希望能夠說出類似的話:

verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verifyTheLastThingCalledOn(row).saveToDatabase();

如果它有幫助,我將從JMock測試中切換到Mockito:

row.expects(once()).method("saveToDatabase").id("save");
row.expects(never()).method(ANYTHING).after("save");

我認為這需要更多的定制工作。

verify(row, new LastCall()).saveToDatabase();

然后

public class LastCall implements VerificationMode {
    public void verify(VerificationData data) {
        List<Invocation> invocations = data.getAllInvocations();
        InvocationMatcher matcher = data.getWanted();
        Invocation invocation = invocations.get(invocations.size() - 1);
        if (!matcher.matches(invocation)) throw new MockitoException("...");
    }
}

上一個答案:

你是對的。 verifyNoMoreInteractions是您所需要的。

verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verify(row).editABunchMoreStuff();
verify(row).saveToDatabase();
verifyNoMoreInteractions(row);

關於主題不是100%,但我只是想找到與驗證相反的,這是唯一相關的結果,它最終我在Mockito.verifyZeroInteractions(mock)之后;

只是因為其他人最終在這里尋找這個......

這個問題讓我對JMockit中Verifications API進行了一些增強(可在即將發布的0.983版本中找到)。

我想出的解決方案允許你編寫(在測試方法中):


    new VerificationsInOrder() {{
        unverifiedInvocations();
        row.saveToDababase();
    }};

...如果您只想驗證在其他所有方法之后調用某個方法。 所有其他調用之前驗證它,只需將調用移至頂部即可。 這實際上適用於任何連續調用序列。

如果除了上述驗證之外,您還想驗證是否以任何順序調用了其他方法,可以在測試中添加第二個驗證塊(在其他塊之前或之后,無關緊要):


    new Verifications() {{
        row.setSomething(value);
        row.setSomethingElse(anotherValue);
    }};

雖然因為使用了匿名內部類而有點長,但這種語法既簡單又靈活; 注意它如何為測試添加結構並避免重復方法調用(如verify(...) )。 它比我在這里描述的更多(Hamcrest匹配器,調用計數等),並且它不僅限於實例方法的驗證(靜態方法和構造函數可以以相同的方式進行模擬和驗證)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM