在单元测试中验证对依赖的调用?

flx*_*lxh 5 java dependencies automated-tests unit-testing dependency-injection

对于以下类,我想编写一个单元测试:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

起初我会将所有方法SomeClass调用存根Dependency,以便单独测试我的类.但我无法找到答案的问题是:

我是否应该如何 SomeClass调用的方法Dependency传递什么参数等等.如?当然这是一个非常简单的例子,但我想知道这是否应该是一般单元测试的一部分.

编辑:在我的情况下Dependency将是我不控制的第三方api库.所以我认为将参数传递给这些函数很重要但是我不确定这应该是单元测试的一部分.

小智 2

我想说,如果调用依赖项,那么您应该至少有一个测试用例来检查它是否被调用。如果您不想涵盖此案例,则意味着(对我而言)您无论如何都不需要调用它。当您有任何条件语句(例如 if/else/switch)时,这一点非常重要。你能想象一下你错误地删除了这行代码吗

 dep.doSomethingElse(processed);
Run Code Online (Sandbox Code Playgroud)

如果不检查依赖项是否被调用,您甚至不会注意到您已删除它。

测试看起来像:

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");
  }

}
Run Code Online (Sandbox Code Playgroud)