【发布时间】: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