【问题标题】:Verify calls to dependency in unit test?在单元测试中验证对依赖项的调用?
【发布时间】:2017-02-13 17:55:48
【问题描述】:

对于下面这个类,我想写一个单元测试:

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 库。因此,我认为将哪些参数传递给这些函数很重要,但我不确定这是否应该成为单元测试的一部分。

【问题讨论】:

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


    【解决方案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");
      }
    
    }
    

    【讨论】:

      【解决方案2】:

      这确实取决于情况,并且高度基于意见......

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

      如果对依赖项的调用很重要,例如当对依赖项的调用是功能的重要部分,甚至是执行方法的全部原因时,您应该考虑测试依赖项是否被正确调用。

      问问自己:您真的关心依赖项是否被调用并正确调用,还是只关心您的被测方法是否能正常工作?

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

      我知道,这有点模棱两可,但我希望你明白。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-29
          • 1970-01-01
          • 1970-01-01
          • 2012-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多