繁体   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