You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mockito 1.9.5构造传参Mock:需Mock外部方法的测试问题

使用Mockito 1.9.5测试MyClass并Mock内部方法

针对你的需求——测试MyClass同时Mock掉它的getStringFromExternalSources方法,在Mockito 1.9.5里我们可以用**部分Mock(Spy)**来实现,既能保留类里其他方法的真实逻辑,又能替换掉依赖外部资源的方法。

核心思路

因为你需要测试的是MyClass本身的逻辑,而不是完全Mock整个类,所以用spy()包装真实的MyClass对象是最合适的。这样除了我们指定Mock的方法外,其他方法都会执行真实代码。另外要注意,在Mockito 1.9.5里,推荐用doReturn().when()的方式来Mock方法,避免不小心触发真实方法的调用(比如这个依赖外部资源的方法,调用真实逻辑可能会影响测试稳定性)。

完整测试代码示例

@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {

    @Test
    public void testExecuteLogicAndMockExternalMethod() {
        // 1. 创建真实MyClass对象的Spy实例
        MyClass myClassSpy = spy(new MyClass("Hello", "World", "!"));

        // 2. Mock getStringFromExternalSources方法,返回我们自定义的测试值
        doReturn("Mocked External Content").when(myClassSpy).getStringFromExternalSources();

        // 3. 测试executeLogic方法,验证真实逻辑是否正常工作
        String executeResult = myClassSpy.executeLogic(" Test");
        assertEquals("HelloWorld! Test", executeResult);

        // 4. 验证Mock方法的返回值是否符合预期
        String externalResult = myClassSpy.getStringFromExternalSources();
        assertEquals("Mocked External Content", externalResult);
    }
}

关键细节说明

  • @RunWith(MockitoJUnitRunner.class):用来让JUnit结合Mockito运行,自动初始化Mockito相关的注解和对象,简化测试代码。
  • spy(new MyClass(...)):创建真实对象的Spy包装类,它会保留原对象的所有属性和方法逻辑,仅替换我们指定Mock的方法。
  • doReturn("...").when(myClassSpy).getStringFromExternalSources():这种写法不会调用真实的getStringFromExternalSources方法,直接返回我们设定的值,完美避开外部资源依赖。如果用when(myClassSpy.getStringFromExternalSources()).thenReturn("..."),在Mockito 1.9.5里会先执行一次真实方法,这可能不是你想要的。

如果你的测试场景是某个方法依赖getStringFromExternalSources的返回值,只需要在测试前Mock好这个方法的返回值,就能轻松测试该方法的不同分支逻辑啦。

内容的提问来源于stack exchange,提问作者user993797

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:48:45