当一个方法完成时,我试图使用Byte Buddy来执行一些额外的逻辑。以下是示例代码:
T proxyClient = JAXRSClientFactory.fromClient(client, classType, true);
this.configureHttpConduit(conduit, invocationTimeout);
Class buddy = new ByteBuddy()
.subclass(classType)
.method(ElementMatchers.isAnnotatedWith(Path.class))
.intercept(MethodDelegation.to(proxyClient)
.andThen(MethodCall.run(new CloseConnection())))
.make()
.load(this.getClass().getClassLoader(),
Default.INJECTION)
.getLoaded();
return (T) buddy.newInstance();
static class CloseConnection implements Runnable {
void close() {
System.out.println("close connection called");
}
@Override
public void run() {
close();
}
}
当我把代表团和。第二次调用时,此实例的原始调用方将丢失来自“proxyClient”对象的返回值,该对象以前用于调用它的方法调用。我是不是用错了?
基本上,我希望在方法的末尾添加一些附加逻辑(在原始方法内部或添加另一个方法调用并不重要),但同时保留原始方法调用的返回值。
这是故意的。对于通过和
链接的每个
实现
,Byte Buddy期望下一个块有一个空堆栈。因此,最后一个实现负责返回。
字节伙伴的想法是将尽可能多的逻辑放入拦截器。我建议您编写自己的拦截器来调用委托,然后调用紧密连接。这也使您能够完全控制调用条件,例如在finally块中关闭:
public class MyInterceptor<T> {
final T proxyClient;
@RuntimeType
public Object intercept(@Origin Method method,
@AllArguments Object[] args) throws Throwable {
try {
return method.invoke(proxyClient, args);
} finally {
// do your completion logic here
}
}
}
这当然可以在性能方面得到改进。请看一下@Pipe注释。
问题内容: 我正在尝试使用“ any”匹配器对这个getKeyFromStream方法进行存根。我尝试了更明确和不太明确的(anyObject()),但似乎无论我如何尝试,此存根都不会在我的单元测试中返回fooKey。 我想知道是否是因为它受到保护,或者我缺少其他东西或做错了什么。在整个测试中,我还有其他的when / then语句在 起作用, 但是由于某种原因,事实并非如此。 注意:getKey
原文是这样的: 这确实令人惊讶,但最终明白了(嗯,至少我想我明白了)为什么会这样发生。 现在,我将第二个更改为: 如果我遗漏了一些明显的东西,或者我的问题是愚蠢的,让我提前说声对不起。还有谢谢你!
测试类别 测试类别 详图搁置器 当我尝试模拟方法HistoryFromStrgyTable()的数据时,它实际上是在调用HistoryFromStrgyTable(),而不是从mockHistoryFromStrgyTable()获取数据。 我的测试用例在这一行失败了 谁能帮我一下吗。我不明白怎么了。我还将方法mockHistoryFromStrgyTable()从private更改为public
我正在使用PowerMockito验证私有方法的调用数:。我还将该方法存根以返回预定义的值。 尽管我已将方法存根,但实际的实现正在被调用,并抛出一个,因为它的依赖项(“loader”变量,请参见下面的代码片段)没有为此测试定义(也不应该定义)。 作为实验,我把方法改成公开,然后就没问题了! 我认为这是PowerMockito中的一个错误,但我在比这更确定的事情上错了! 这是密码 为了澄清,类看起来
我正在尝试使用JpaRepository、spring boot和mysql发布文章 我有一张像这样的桌子 每当我尝试保存数据时,无论我传递什么值,列user总是0。 存储库如下所示 控制器如下所示
我对反应性编程相对较新。我的问题是关于