[英]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.