如何为无默认构造方法的类创建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
相关产品推荐
相关产品推荐

