我最近问了几个面向 jUnit 和 Mockito 的问题,但我仍然很难掌握它的窍门。这些教程都是针对非常简单的示例,所以我正在努力扩大我的测试用例以适用于我的类(class)。
我目前正在尝试为我在 web 应用程序中的一个代理中使用的方法编写一些测试用例。该方法与代理内部的其他几个方法交互以验证某些对象。我现在只想测试这个方法。
这是我尝试做的:
像这样创建我的代理的 Mockito 对象:
MyProcessingAgent mockMyAgent = Mockito.mock(MyProcessingAgent.class);
使用 Mockito.when 设置 stub (希望是正确的术语),如下所示:
Mockito.when(mockMyAgent.otherMethod(Mockito.any(arg1)).thenReturn(requiredReturnArg);
尝试像这样执行我的方法:
List myReturnValue = mockMyAgent.methodThatNeedsTestCase();
我期待 myReturnValue
中的内容,但收到 0,所以我尝试调试。当我调用该方法时,它永远不会执行。我在方法的第一行有一个永远不会被触及的调试点。
如果我想在类的一个方法中执行代码,但强制类中的其他方法(尝试与外部世界中的数据库交互的方法)返回伪造的值。 Mockito 可以做到这一点吗?
看来我目前的方法不是正确的测试风格,但我不确定如何继续前进。我可以模拟我的类并让一个方法像平常一样执行,而其他方法被 stub 以返回我的给定值,这样我就不必在测试这个方法期间处理数据访问?
最佳答案
您将 Mock
与 Spy
混淆了。
在模拟中,所有方法都被 stub 并返回“智能返回类型”。这意味着调用模拟类的任何方法什么都不做,除非你指定行为。
在 spy 中,类的原始功能仍然存在,但您可以在 spy 中验证方法调用并覆盖方法行为。
你想要的是
MyProcessingAgent mockMyAgent = Mockito.spy(MyProcessingAgent.class);
一个简单的例子:
static class TestClass {
public String getThing() {
return "Thing";
}
public String getOtherThing() {
return getThing();
}
}
public static void main(String[] args) {
final TestClass testClass = Mockito.spy(new TestClass());
Mockito.when(testClass.getThing()).thenReturn("Some Other thing");
System.out.println(testClass.getOtherThing());
}
输出是:
Some Other thing
注意:您真的应该尝试模拟正在测试的类的依赖项而不是类本身。
关于java - 使用 Mockito stub 并执行测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15976008/