Mockito链式调用测试:TestedClass的methodToTest测试方案咨询
解决Mockito嵌套Mock与测试的正确方案
这个问题其实是Mockito中很常见的链式调用mock场景,你遇到的问题大概率是没处理好嵌套对象的mock或者字段注入,我给你一步步拆解正确的实现方式:
1. 先明确完整的类结构(补充你代码中隐含的类型)
首先我们把你给出的类补充完整,方便后续测试代码的理解:
class TestedClass { InnerClass inner; public void methodToTest() { inner.getSomething().AddSomething(new Something()); } } class InnerClass { // 假设getSomething()返回的类型是SomeContainer,你可以替换成实际业务类型 SomeContainer getSomething() { return new SomeContainer(); } } class SomeContainer { void AddSomething(Something something) { // 你的业务逻辑 } } class Something {}
2. 正确的Mock与测试实现(两种方式)
方式一:使用Mockito注解简化配置
这种方式更简洁,适合大多数测试场景:
import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class TestedClassTest { // Mock InnerClass实例 @Mock private InnerClass mockInner; // 关键:mock getSomething()返回的嵌套对象 @Mock private SomeContainer mockSomeContainer; // 自动将mock注入到被测类的对应字段中 @InjectMocks private TestedClass testedInstance; @Test public void testMethodToTest() { // 配置mock行为:当调用mockInner.getSomething()时,返回我们mock好的SomeContainer when(mockInner.getSomething()).thenReturn(mockSomeContainer); // 执行被测方法 testedInstance.methodToTest(); // 验证AddSomething方法是否被正确调用 // 因为方法里是new Something(),用any()匹配任意该类型实例即可 verify(mockSomeContainer).AddSomething(any(Something.class)); // 如果需要验证具体参数(比如对象属性),可以自定义参数匹配器,这里用any足够覆盖场景 } }
方式二:手动初始化Mock(适合不喜欢注解的场景)
如果你偏好手动控制所有mock对象的创建,也可以这样写:
import org.junit.Test; import static org.mockito.Mockito.*; public class TestedClassTest { @Test public void testMethodToTest() { // 手动创建所有需要的mock对象 InnerClass mockInner = mock(InnerClass.class); SomeContainer mockSomeContainer = mock(SomeContainer.class); // 创建被测实例,并手动设置inner字段为mock对象 TestedClass testedInstance = new TestedClass(); testedInstance.inner = mockInner; // 配置链式调用的mock行为 when(mockInner.getSomething()).thenReturn(mockSomeContainer); // 执行被测方法 testedInstance.methodToTest(); // 验证方法调用 verify(mockSomeContainer).AddSomething(any(Something.class)); } }
3. 你之前失败的常见原因
- 忘记mock嵌套对象:只mock了
InnerClass,但inner.getSomething()返回的是真实对象或者null,导致调用AddSomething()时触发空指针或Mockito异常。 - 未正确注入mock:被测类中的
inner字段未被设置为mock对象,仍然是null,执行方法时直接空指针。 - 参数匹配错误:如果尝试用
eq(new Something())验证,因为每次new的都是不同实例,会导致验证失败,必须用any(Something.class)这类匹配器。
内容的提问来源于stack exchange,提问作者user860067
相关产品推荐
相关产品推荐

