我最近已经问了几个有关jUnit和Mockito的问题,但我仍然很努力地把握住这个问题。这些教程都是针对非常简单的示例的,因此我正在努力扩大测试用例以适合我的课程。
我目前正在尝试为Webapp中我的一个代理中的方法编写一些测试用例。该方法与代理内部的其他两种方法交互以验证某些对象。我现在只想测试这种方法。
这是我尝试做的事情:
MyProcessingAgent mockMyAgent = Mockito.mock(MyProcessingAgent.class);
Mockito.when(mockMyAgent.otherMethod(Mockito.any(arg1)).thenReturn(requiredReturnArg);
List myReturnValue = mockMyAgent.methodThatNeedsTestCase();
我原本希望在中进行操作myReturnValue,但是却收到0,因此我尝试调试。当我调用该方法时,它永远不会执行。我在方法的第一行有一个调试点,它永远不会被触碰。
myReturnValue
如果我想在一个类的一个方法中执行代码,但要强制该类中的其他方法(一个试图与外部数据库交互的方法)返回伪造的值。Mockito有可能吗?
看来我目前的方法不是正确的测试风格,但是我不确定该如何前进。我可以模拟我的类并让一个方法像普通方法一样执行,而其他方法却被存根以返回给定的值,这样我就不必在测试该方法时处理数据访问了吗?
您正在将a Mock与混淆Spy。
Mock
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
注意:您应该真正尝试模拟正在测试的类的依赖关系,而 不是 类本身。