我有下面的测试用例
@Test
public void test() throws IOException {
try (MockedStatic<AWSStepFunctionsClientBuilder> awsMock = Mockito.mockStatic(AWSStepFunctionsClientBuilder.class, Mockito.RETURNS_DEEP_STUBS)) {
AWSStepFunctions awsStepFunctionsMock = mock(AWSStepFunctions.class);
awsMock.when(() -> AWSStepFunctionsClientBuilder.standard().withClientConfiguration(Mockito.any()).build()).thenReturn(awsStepFunctionsMock);
MockedStatic<HttpClients> httpClientsMockedStatic = Mockito.mockStatic(Mockito.RETURNS_DEEP_STUBS);
httpClientsMockedStatic.when( () -> HttpClients.custom().setRetryHandler.build()).thenReturn(httpClientMock);
}
}
我在这个类中使用相同的对象运行多个测试,然后单独运行,然后很好地运行,但是当我同时运行所有测试时,我得到了org.mockito.exceptions.base.MockitoException: For org.apache.http.impl.client.HttpClients, static mocking is already registered in the current thread. To create a new mock, the existing static mocking must be deregistered.
。
我有另一种方法可以配置httpClientsMockedStatic,或者有解决这个问题的方法吗?我试着为每个变量使用不同的变量名,但这是行不通的。还在测试后尝试了close(),并使用了closeOnDemand,但这似乎不起作用。
我还必须使用PowerMockito来创建新的对象,因为在我测试的类中创建了许多我无法修改的新对象。如果有一种方法可以通过Mockito实现,而不需要对多个对象和它们的行为进行资源尝试,那么我也能做到这一点。
提前感谢!
发布于 2022-09-28 03:01:36
我就是这样解决这个问题的。首先,我需要用Junit4、PowerMockito和Mockito 4.0.0的特殊组合来使用它。
我在寻找各种方法来配置MockitoSettings以关闭创建的实例/线程,但结果是我可以配置它们,就像在@BeforeClass setUp方法中配置其他Mock一样。
public ClassTest {
private static CloseableHttpClient httpClientMock;
private static MockedStatic<HttpClients> httpClientsMockedStatic;
@BeforeClass
public static void setUp() throws IOException {
httpClientMock = mock(CloseableHttpClient.class);
httpClientsMockedStatic = Mockito.mockStatic(HttpClients.class, Mockito.RETURNS_DEEP_STUBS);
httpClientsMockedStatic.when( () -> HttpClients.custom().setRetryHandler.build()).thenReturn(httpClientMock);
// You can also configure the behavior of above line in whatever test method you would like
}
您还可以在@After方法中的静态模拟变量上执行.close,就像上面的示例那样,它将是httpClientsMockedStatic.close()
https://stackoverflow.com/questions/73873061
复制相似问题