如何使用 PowerMockito 模拟受保护的静态内部类

Nic*_*rce 2 java unit-testing mockito powermockito

我有一个带有受保护的静态内部类的公共外部类,我需要模拟它以进行单元测试。我们正在使用 Mockito 和 PowerMockito,但在我的搜索过程中我没有找到任何与此相关的内容。有没有人有任何想法?将内部类重构为类之外并且是公共类或任何类似的东西现在也是不可能的。

Mor*_*fic 5

给定一个类似于

public class OuterClass {

    public OuterClass() {
        new InnerClass();
    }

    protected static class InnerClass {
        public InnerClass() {
            throw new UnsupportedOperationException("Muahahahaha!"); // no touchy touchy!
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...您应该能够执行以下操作

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.junit.Assert.assertNotNull;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.whenNew;

@RunWith(PowerMockRunner.class) // delegate test running to PowerMock
@PrepareForTest(OuterClass.class) // mark classes for instrumentation so magic can happen
public class InnerClassTest {

    @Test
    public void shouldNotThrowException() throws Exception { // oh, the puns!
        // make a mockery of our inner class
        OuterClass.InnerClass innerClassMock = mock(OuterClass.InnerClass.class);

       // magically return the mock when a new instance is required
       whenNew(OuterClass.InnerClass.class).withAnyArguments().thenReturn(innerClassMock);

        // yey, no UnsupportedOperationException here!
        OuterClass outerClass = new OuterClass();
        assertNotNull(outerClass);
    }
}
Run Code Online (Sandbox Code Playgroud)