【发布时间】:2016-06-10 09:58:28
【问题描述】:
我有这样的代码结构。 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 为空,但我希望它等于 mockObjA。
我也从测试中尝试使用classASpy.methodToTest() 进行调用。但随后它在Object d = classB.methodInB(c) 行methodToTest() 中给出NullPointerException。
测试这种情况的正确方法是什么?
【问题讨论】:
-
使用 Mockito 注释需要 Mockito 运行器或适当的规则或 initMocks 调用,请参阅文档:site.mockito.org/mockito/docs/current/org/mockito/…
-
我已经更新了测试代码。我在设置方法中使用 initMocks。我错过了在这里提及它。
-
你能发一个minimal reproducible example吗?
-
为
methodInA写一个测试,然后为methodToTest写一个测试,不用担心methodInA?
标签: unit-testing junit mocking mockito spy