【问题标题】:Mocked static outer class members are null when testing static inner class with PowerMockito使用 PowerMockito 测试静态内部类时,模拟的静态外部类成员为空
【发布时间】:2022-01-20 17:58:41
【问题描述】:

我有一个如下所示的课程:

public class OuterClass {
    protected static Server s;

    public static class CrazyEvent implements Runnable {

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

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

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

@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 扩展实际的 Server 对象,因此我可以覆盖在构造函数中调用的烦人方法。我的模拟服务器对象是 s。理想情况下,我想将此模拟注入到嵌套的静态内部类中,因为它必须使用它。

问题是,当我调用 ce.run() 时,s 为 null,并且模拟没有正确注入。我对 PowerMockito 还是很陌生,我一直在努力寻找有关此特定案例的 SO 信息。

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

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

【问题讨论】:

  • 我认为您需要先致电OuterClass.s = s,然后再致电ce.run()
  • 哦,呵呵。谢谢@蒂姆
  • 好吧,有一个新问题。外部类有一个私有静态成员,它是一个 slf4j 记录器。在 run 方法中,它调用 log.info(),但 log 为 null,我无法实例化它。我有什么选择?
  • 请提出一个新问题,包括显示记录器的初始化和使用的代码

标签: java unit-testing junit mockito powermockito


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多