Java Mockito - 如何测试调用同一类中的方法以及来自其他类的方法的方法



我有这样的代码结构。ClassA中的方法methodToTestClassA中调用方法,在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
    }
}

我试图嘲笑这两个电话,即打电话给methodInAmethodInB

以下是单元测试代码

@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是否正常工作。

相关内容

  • 没有找到相关文章

最新更新