Mockito的基本嘲讽场景



我开始玩java Mockito框架和mocking概念。你能向我解释一下如何测试这个基本场景吗?

有一个用例A,它有一个公共方法(calculate)和几个私有/受保护的方法。在计算过程中的某个地方,另一个用例被称为(B)。为了调用B,必须准备大量的参数。B也产生相当复杂的输出。我想以这样一种方式准备测试,即我可以用我自己的存根替换对B的实际调用——这是一个非常琐碎的情况。然而,A只有一个公共方法calculate,我不希望在同一个包中进行测试以访问受保护的方法。重新设计类A可能带来的麻烦多于解脱——它不是我设计的,代码的不同部分之间存在一些关系,这使得用公共方法创建新类有点奇怪。

你能告诉我一些建议或指出一些阅读材料吗?

为了使用Mockito(或任何其他模拟框架)将实际的B替换为您自己的B,您将能够通过创建构造函数手动注入B

public A(B b) { localB = b; }

通过创建一种方法

public void setB(B b) { localB = b; }

或者通过使用某种自动注入框架。

然而,如果B是完全封装和隐藏的,并且不能更改,那么你可以针对B编写测试,以表明给定的已知输入B返回预期的输出

然后对A进行测试,即在给定已知输入的情况下,A.calculate()会给出预期输出。

如果您可以显示B的行为符合预期,而A的行为符合期望,那么您就不需要显式显示A正确地调用了B,因为您是在隐式测试它。


编辑是因为@david wallace的咖啡比我少,睡眠也比我多!

您不需要注入模拟B。如果这有帮助,您可以注入实际的B,但首先创建一个间谍a.getB();

B spyB = spy(new B());
//maybe stub the method return here    
A a = new A(spyB);
a.calculate();
verify(spyB).complicatedThingForCalculate("a", "lot", "of", "specified", "parameter");

进一步编辑:正如评论中所指出的,你最好使用Mock而不是间谍。来自文件:

真正的间谍应该谨慎使用,偶尔使用,例如处理遗留代码。

所以我把它包括在这里,因为你说你不想/没有改变A和B的自由。

假设您的类A创建了类B的实例。这总是会导致可测试性问题,因为很难让它创建模拟实例。处理这个问题的一个非常好的方法是允许为类B注入一个工厂类。这是我在维基上关于主题的文章中的"模式2">

相关内容

  • 没有找到相关文章

最新更新