如果我需要测试是否调用了类中的方法是否已调用,可以在没有Mockito的情况下完成(或任何有关此事的模拟工具((?
原因是,无论我在哪里读到有关莫科托和类似工具的何处,它都说不应该模拟剪切,而是它的依赖性(那一部分很明显(。
所以,如果那样的话,只剩下2个选项:
- 还有其他一些方法可以在不嘲笑的情况下进行测试
或
- 该方法被称为本身,不应自身测试,而是某些副作用或方法返回值
例如(Trivial和非现实世界(,MyClass
类可以具有2种方法:A()
和B()
。条件根据某些内部状态调用B。安排状态&通过调用A()
行动,我们想断言B()
是被调用的。在不嘲笑整个剪辑的情况下,这是不可能的,或者在单个类中的2种方法总是违反SRP的气味,并要求重新设计B()
实际上应该(嘲笑(MyClass
切割的依赖性。
那么,什么正确?
通常我倾向于不使用间谍,而是我更喜欢以我写的任何类的方式编写代码:
-
i仅测试非私有方法,因为它们是正在测试的类中的入口点。因此,在您的示例中,如果a((调用b((,则可能是b((是私人的,因此不应进行测试。概括地说,一个((是"可以做"的类(行为(,因此我测试了行为,而不是方法本身。如果这种行为在内部称为其他事物 - 好吧,这是该课程的内部问题,如果可能的话,我不会对课程内部的工作方式做出任何假设,并且始终更喜欢" white -box"测试。我在测试中仅测试"一个"非私有方法。
-
所有方法都应返回某些东西(最佳选项(或至少调用依赖项,或更改正在测试的对象的内部状态。依赖项列表总是很清楚地理解,我不能在不提供依赖项列表的情况下实例化剪切对象。例如,使用构造函数依赖注入是这样做的好方法。我确实只嘲笑依赖项,从不嘲笑/间谍削减。依赖项永远不会静态,而是注射。
现在有了这些简单的规则,需要" 测试是否调用了正在测试的类方法"基本上可以归结为以下一个:
-
您正在谈论私人方法。在这种情况下 - 不要测试它,仅测试公共事物。
-
该方法是公开的 - 在这种情况下,您将其在单元测试中明确称为,因此无关紧要。
现在让我们问为什么如果调用了cut中的方法,您是否要测试此问题?
如果要确保它改变了某些东西。如果此类"某事"在班级中 - 换句话说,其内部状态已经发生变化,请检查测试是否确实在状态下通过调用另一种允许查询状态的方法完成了更改如果此"某种东西"是由依赖关系管理的代码,请创建一个依赖性的模拟并验证它是用预期参数调用的。
看一下Mockito文档(https://static.javadoc.io/org.mockito/mockito/mockito-core/3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.bhtml#13(
使用Spy
时,您可以在正在测试的同一类中"替换"一种方法。
@ExtendWith(MockitoExtension.class)
public class Test {
class MyClass {
public void a() {
b();
}
public void b() {
}
}
@Test
public void test() {
MyClass testClass = new MyClass();
MyClass spy = Mockito.spy(testClass);
Mockito.doNothing().when(spy).b();
spy.a();
Mockito.verify(spy, Mockito.times(1)).b();
}
}
所以这是否应该做的事情是一个不同的问题;(
我认为这在很大程度上取决于B((实际在做什么方法,以及首先应该是MyClass的一部分。
如果不嘲笑整个剪裁,这是不可能的
在这种情况下,我们不仅模拟整个剪辑,只有您不想被调用的方法。
原因是,无论我在哪里读到有关莫科托和类似工具的何处,它都说不应该模拟剪切,而是它的依赖性(那一部分很明显(。
我相信,这种说法与间谍相关并不完全准确。
在我眼中间谍活动的全部目的是在测试的课堂上使用它。为什么要监视首先不应该成为测试一部分的依赖性?