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

gz5pxeao  于 2023-09-29  发布在  Java
关注(0)|答案(4)|浏览(86)

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

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

一开始,我会在Dependency上存根所有SomeClass调用的方法,以便隔离地测试我的类。但我还没找到答案的问题是:
我是否应该检查SomeClass如何调用Dependency的方法,例如:传递什么参数等。当然,这是一个非常简单的例子,但我想知道这是否应该是一般单元测试的一部分。
编辑:在我的情况下,Dependency将是第三方API库,我不控制。所以我认为传递给这些函数的参数很重要,但是我不确定这是否应该是单元测试的一部分。

kuuvgm7e

kuuvgm7e1#

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

}
nmpmafwu

nmpmafwu2#

测试Dependency不应该是类SomeClass的单元测试的一部分。不要测试Dependency的方法调用的正确性和准确性。
你可以检查传递给Dependency方法的参数值,如果这些值是SomeClass类的本地值,即由SomeClass创建和管理,否则执行正常的输入检查Assert。

piv4azn7

piv4azn73#

这真的取决于情况,并且是高度基于意见的。
我会说,如果对依赖项的调用只是帮助你的方法完成它的工作,那么就不要测试这个调用。只是测试你的方法是否完成了它的工作。
如果对依赖项的调用很重要,比如当对依赖项的调用是功能的重要部分,甚至是执行方法的全部原因时,您应该考虑测试依赖项是否被正确调用。
扪心自问:你真的关心依赖被调用,并且被正确地调用,还是你只关心你的方法在测试中完成了它的工作?
或者从另一个Angular 来看:依赖项只是你的类的一部分,还是你的类与之交互的一个独立对象?
我知道,这是相当模棱两可的,但我希望你得到的想法。

13z8s7eq

13z8s7eq4#

我想是的。你应该去抓阿格斯。我认为值得检查你与依赖项的交互,以及你是如何做到的。

相关问题