我有这样的代码结构。ClassA
中的方法methodToTest
在ClassA
中调用方法,在ClassB
中调用方法
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
为 null,但我希望它等于 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
是否正常工作。