首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取静态模拟已在当前线程异常中注册。

获取静态模拟已在当前线程异常中注册。
EN

Stack Overflow用户
提问于 2022-09-27 19:46:09
回答 1查看 359关注 0票数 0

我有下面的测试用例

代码语言:javascript
运行
复制
@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实现,而不需要对多个对象和它们的行为进行资源尝试,那么我也能做到这一点。

提前感谢!

EN

Stack Overflow用户

回答已采纳

发布于 2022-09-28 03:01:36

我就是这样解决这个问题的。首先,我需要用Junit4、PowerMockito和Mockito 4.0.0的特殊组合来使用它。

我在寻找各种方法来配置MockitoSettings以关闭创建的实例/线程,但结果是我可以配置它们,就像在@BeforeClass setUp方法中配置其他Mock一样。

代码语言:javascript
运行
复制
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()

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73873061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档