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

如何为无默认构造方法的类创建Mock对象(PowerMockito场景)

解决PowerMockito模拟类A中内部实例化B对象的问题

问题出在类A的构造函数里直接new了B实例,普通Mock没法替换这个内部创建的对象,得用PowerMock的whenNew方法拦截这个构造调用才行。另外你之前的@PrepareForTest注解写错了,要处理的是执行new操作的类A,不是被实例化的B类。

下面是修正后的完整测试代码:

@RunWith(PowerMockRunner.class)
// 重点:Prepare的是包含new B操作的A类,不是B类
@PrepareForTest(A.class)
class ATest {

    private B mockB;

    @Before
    void setup() {
        // 创建B的Mock对象
        mockB = Mockito.mock(B.class);
    }

    @Test
    public void testInvokeAnotherClassMethod() throws Exception {
        // 拦截A类里new B("Test")的调用,返回我们的mock对象
        PowerMockito.whenNew(B.class).withArguments("Test").thenReturn(mockB);
        
        // 给mockB的myLogic方法设置自定义返回值
        Mockito.when(mockB.myLogic()).thenReturn("mockedResponse");
        
        // 实例化A,此时A构造函数里的B会被替换成mockB
        A a = new A();
        
        // 调用要测试的方法
        a.invokeAnotherClassMethod();
        
        // 验证mockB的myLogic方法是否被调用了一次
        Mockito.verify(mockB, Mockito.times(1)).myLogic();
    }
}

关键步骤说明:

  • @PrepareForTest(A.class):告诉PowerMock需要修改A类的字节码,才能拦截其中的new对象操作。
  • PowerMockito.whenNew(...):精准匹配构造方法的参数(这里是"Test"),让A创建B的时候返回我们的mock实例,而不是真实的B对象。
  • 实例化A之后,它内部的b成员已经是mock对象,后续调用业务方法时就会用mock的逻辑,方便我们验证行为或自定义返回值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:23:21