Java 静态方法 Mock 失败-because it or one of its supertypes could not be initialized

目录

近日,在给项目添加单元测试时,遇到了一个奇怪的问题:

org.mockito.exceptions.base.MockitoException: Cannot instrument class com.*****.BlaBlaClient because it or one of its supertypes could not be initialized

测试的逻辑是这样的

1
2
3
4
5
...
MockedStatic<BlaBlaClient> clientMock = mockStatic(BlaBlaClient.class);
clientMock.when(() -> BlaBlaClient.get(Constant.CACHE_CONFIG_KEY))
.thenReturn(xmlConfig);
...

网上搜了半天,没找到什么有价值的信息,stackoverflow上找到的有点相关的问题也是数年前提的,甚至还没解决。

只好回来继续看看代码。

发现代码里面

1
2
3
4
5
6
7
8
9
10
11
public class BlaBlaClient {

static {
init();
}

public static void init() {
BlaBlaService.init();
}
...
}

根据直觉推测,supertypes应该就是这个BlaBlaService,于是尝试了

1
2
3
4
MockedStatic<BlaBlaService> serviceMock = mockStatic(BlaBlaService.class);
MockedStatic<BlaBlaClient> clientMock = mockStatic(BlaBlaClient.class);
clientMock.when(() -> BlaBlaClient.get(Constant.CACHE_CONFIG_KEY))
.thenReturn(xmlConfig);

结果就可以正常跑了,可喜可贺。