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