Java Mockito - 如何测试在同一个类中调用方法的方法以及其他类中的方法?
我有这样的代码结构。方法methodToTest
在ClassA
呼吁在ClassA
的方法以及以及在ClassB
Java Mockito - 如何测试在同一个类中调用方法的方法以及其他类中的方法?
public class ClassA {
@Autowired
ClassB classB;
public void methodToTest() {
Object c = methodInA();
Object d = classB.methodInB(c);
}
public Object methodInA() {
//do something
}
}
public class ClassB {
public Object methodInB(Object obj) {
//do something
}
}
我试图嘲弄两个呼叫即打电话methodInA
和methodInB
下面的方法是单元测试代码
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class ClassATest {
@InjectMocks
ClassA classA;
@Mock
ClassB classB;
@Spy
ClassA classASpy;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
//Test method in ClassA
@Test
public void testMethodInA() {
Object mockObjA = mock(Object.class);
Object mockObjB = mock(Object.class);
doReturn(mockObjA).when(classASpy).methodInA();
when(classB.methodInB(mockObjA)).thenReturn(mockObjB);
classA.methodToTest();
//assertions
}
}
在运行测试,Object c
为空,但我希望它是等于mockObjA
。
我也尝试过使用classASpy.methodToTest()
进行调用。但是,它在methodToTest()
的Object d = classB.methodInB(c)
处给出NullPointerException
。
测试此类情况的正确方法是什么?
当您调用methodToTest
时,您正在测试单元ClassA
。通过嘲弄某个单位来改变被测试的单位并没有多大意义。因为那样你会测试一些完全不同的东西,然后ClassA
。
你应该做的是测试classB.methodInB
是否被调用了正确的参数。您可以使用ArgumentCaptor
作为调用classB.methodInB
的参数。
ArgumentCaptor<Object > argument = ArgumentCaptor.forClass(Object .class);
verify(mockObjB).methodInB(argument.capture());
Object capturedArgument = argument.getValue();
然后你就capturedArgument
断言验证ClassA.methodInA
工作正常。
但是接下来我将不得不模拟所有在'methodInA()'中调用的外部方法调用,如果'methodInA'真的很复杂,那么在每个使用'methodInA()' – msfk
@msfk的方法的测试中, 'ClassA'不符合单一责任原则。如果是这样的话,将'methodnInA'提取到它自己的接口可能是有意义的。然后你也可以模拟对'methodInA'的调用。 – SpaceTrucker
我从实际的类中分离出一个辅助类,并将这些方法作为公共方法移动到辅助类中。这是一个很好的做法吗? – msfk
使用Mockito注释需要Mockito亚军或适当的规则或initMocks调用,请参阅文档:http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#mock_annotation – 2016-06-10 10:00:36
我已经更新了测试代码。我在setup方法中使用initMocks。我错过了在这里提及它。 – msfk
你可以发布[mcve]吗? – 2016-06-10 10:20:37