使用 PowerMockito 测试静态内部 class 时,模拟静态外部 class 成员为空

Mocked static outer class members are null when testing static inner class with PowerMockito

我有一个 class 看起来像这样:

public class OuterClass {
    protected static Server s;

    public static class CrazyEvent implements Runnable {

        @Override
        public void run() {
            s.getSystemInfo();
        }
    }
}

它有一个 Server 类型的静态成员 s,以及一个名为 CrazyEvent 的内部静态成员 class,它从 Server 中提取一些信息。

我正在尝试在 powermockito 中测试这个 运行() 方法:

@RunWith(PowerMockRunner.class)
@PrepareForTest(OuterClass.class)
public class StaticInnerClassTest {
    private static class ServerMock extends Server {

        protected ServerMock(ServerConfig sc) {
            super(sc);
        }

        @Override
        public void start() {

        }
    }

    private static class ServerConfigMock extends ServerConfig {

    }

    @Mock
    ServerMock s = new ServerMock(new ServerConfigMock());

    @Mock
    UserMan um;

    @InjectMocks
    OuterClass.CrazyEvent ce = new OuterClass.CrazyEvent();

    @Before
    public void setUp() {

        MockitoAnnotations.initMocks(this);
        when(s.getUserMan()).thenReturn(um);

    }

    @Test
    public void testInnerClass() {
        ce.run();
    }

}

让我们看一下代码: 我正在使用 ServerMock 扩展实际的服务器对象,这样我就可以覆盖在构造函数中调用的恼人方法。我模拟的服务器对象是 s。理想情况下,我想将此模拟注入嵌套静态内部 class 因为它必须使用它。

问题是,当我调用 ce.run() 时,s 为 null 且模拟未正确注入。我是 PowerMockito 的新手,我一直在努力寻找有关此特定案例的信息。

编辑: 外部 class 中有一个私有静态 slf4j 记录器,当被内部 class 中的 运行() 方法调用时,它为 null。我不知道如何实例化它。我尝试扩展外部 class 并保护记录器并以这种方式实例化它,但没有成功。

没关系,我不小心离开了对 PowerMockito.mockStatic() 的调用,这破坏了一切

只需在 setUp() 中添加 OuterClass.s = s

我还介绍了一个问题,我使用 PowerMockito.mockStatic(Outerclass.class) 导致我的静态记录器变为空。我删除了这一行。