使用 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)
导致我的静态记录器变为空。我删除了这一行。
我有一个 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)
导致我的静态记录器变为空。我删除了这一行。