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

时间:2016-10-05 10:22:03

标签: java unit-testing dependency-injection dependencies automated-tests

对于下面的课程,我想写一个单元测试:

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如何调用Dependency的方法,例如什么参数传递等? 当然这是一个非常简单的例子,但我想知道这是否应该是一般单元测试的一部分。

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

3 个答案:

答案 0 :(得分:1)

测试Dependency不应该是类SomeClass的单元测试的一部分,即不要测试Dependency的方法调用的正确性和准确性。

您可以检查传递给Dependency方法的参数值,如果这些值是类SomeClass的本地值,即由SomeClass创建和管理,否则执行正常的输入检查断言。

答案 1 :(得分:1)

这实际上取决于具体情况,并且是基于意见的......

我想说,如果对依赖项的调用只是帮助您的方法完成其工作,请不要测试该调用。只是测试你的方法是否能完成它的工作。

如果对依赖项的调用很重要,比如对依赖项的调用是函数的重要部分,甚至是执行方法的全部原因,那么应该考虑测试是否正确调用了依赖项。

问问自己:你是否真的关心依赖被调用,并且被正确调用,或者你只关心被测试的方法是否能够完成它的工作?

或者从不同的角度来看待它:依赖只是你的类的一部分,还是你的类与之交互的独立对象?

我知道,这是相当含糊的,但我希望你明白这一点。

答案 2 :(得分:1)

我想说如果调用依赖项,那么你应该至少有一个测试用例来检查它是否被调用。如果你不想覆盖这种情况,这意味着(对我来说)你无论如何都不需要打电话。当你有任何条件语句如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");
  }

}