JUnit5.如何在参数解析器之间共享示例?

w8f9ii69  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(82)


我有一个ParameterResolver。它返回一个MyHttpClient示例。很有效没事的

public class HttpClientProvider implements ParameterResolver {
    @Override
    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
        return parameterContext.getParameter().getType().equals(MyHttpClient.class);
    }

    @Override
    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
        return new MyHttpClient();
    }
}

字符串
我想创建另一个ParameterResolver。它应该返回一个由Http请求创建的实体。所以要提出请求,我需要提供一个客户端。目前,它只是一个私人领域。

public class EntityProvider implements ParameterResolver {
    private final MyHttpClient client = new MyHttpClient();

    @Override
    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
        return parameterContext.getParameter().getType().equals(MyEntity.class);
    }

    @Override
    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
            MyEntity item = client.create();
            return item;
    }

问题是

我必须创建MyHttpClient两次:for HttpClientProvider and in EntityProvider(to make a create-request).这是代码重复。

问题:

有没有什么解决方案可以从EntityProvider调用HttpClientProvider:resolveParameter,或者在两个ParameterResolver之间共享一个MyHttpClient的示例?

UPD.复制粘贴解决方案

感谢@johanneslink解决方案正在使用存储。
如何共享(HttpClientProvider)

public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
        MyHttpClient client = new MyHttpClient();
        extensionContext.getStore(Namespace.GLOBAL).put("client", client);
        return client;
    }


要获取的Ho(EntityProvider)

public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
        MyHttpClient client = (MyHttpClient)extensionContext.getStore(Namespace.GLOBAL).get("client");
        MyEntity item = client.create();
        return item;
    }

uidvcgyl

uidvcgyl1#

在扩展中保持状态是通过Jupiter所谓的“存储”来完成的。这里有记录。
另一个StackOverflow回答描述了该方法:https://stackoverflow.com/a/53142365/32352
你永远不应该做的是在扩展中使用成员变量,并假设下一次调用同一个扩展时会给予相同的值。扩展示例的生命周期大多数(并且是故意的)是未定义的,因为它是上下文相关的。测试顺序、并发测试执行和测试类的嵌套都在这里起作用。

相关问题