簡體   English   中英

在單元測試中驗證對依賴的調用?

[英]Verify calls to dependency in unit test?

對於以下類,我想編寫一個單元測試:

public class SomeClass {

    private Dependency dependency;

    public SomeClass(Dependency dep){
        this.dependency = dep;
    }

    private String processString(String s){
        /*
        edit the string and return
         */
    }

    public void doSomething(String arg){

        String processed = processString(arg);

        dep.doSomethingElse(processed);
    }
}

首先,我將存儲SomeClass調用Dependency所有方法,以便SomeClass測試我的類。 但我無法找到答案的問題是:

我應該檢查SomeClass 如何調用Dependency方法,例如傳遞什么參數等? 當然這是一個非常簡單的例子,但我想知道這是否應該是一般單元測試的一部分。

編輯:在我的情況下Dependency將是我不控制的第三方api庫。 所以我認為將參數傳遞給這些函數很重要但是我不確定這應該是單元測試的一部分。

測試Dependency不應該是SomeClass類的單元測試的一部分,即不測試Dependency方法調用的正確性和准確性。

您可以檢查傳遞給Dependency方法的參數值,如果這些值是SomeClass類的本地值,即由SomeClass創建和管理,否則執行正常的輸入檢查斷言。

這實際上取決於具體情況,並且是基於意見的......

我會說,如果對依賴項的調用只是幫助您的方法完成其工作,請不要測試該調用。 只是測試你的方法是否能完成它的工作。

如果對依賴項的調用很重要,比如對依賴項的調用是函數的重要部分,甚至是執行方法的全部原因,那么您應該考慮測試是否正確調用了依賴項。

問問自己:你是否真的關心依賴被調用,並且被正確調用,或者你只關心你的測試方法是否有效?

或者從不同的角度來看待它:依賴只是你的類的一部分,還是你的類與之交互的獨立對象?

我知道,這是相當模糊的,但我希望你能得到這個想法。

我會說如果調用依賴項,那么你應該至少有一個測試用例來檢查它是否被調用。 如果你不想覆蓋這種情況,這意味着(對我來說)你無論如何都不需要打電話。 當你有任何條件語句如if / else / switch時,這非常重要。 你能想象你錯誤地刪除了這行代碼

 dep.doSomethingElse(processed);

在不檢查依賴項是否被調用的情況下,您甚至不會注意到已將其刪除。

測試看起來像:

import static org.fest.assertions.Assertions.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest {

  @Mock
  private Dependency dependency;

  @InjectMocks
  private SomeClass someClass;

  @Captor
  private ArgumentCaptor<String> argumentCaptor;

  @Test
  public void shouldCallDependency() throws Exception {
    //given
    String arg = "arg";

    //when
    someClass.doSomething(arg);

    //then
    Mockito.verify(dependency).doSomethingElse(argumentCaptor.capture());
    assertThat(argumentCaptor.getValue()).isEqualTo("processed");
  }

}

暫無
暫無

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

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