我有以下问题。我有一个使用连接实现的方法。也就是说,该方法如下所示:
try (Connection conn = getConnection()) {
// Do some queries here
}
但是,我们需要有一个精确的统计数据,这个方法执行了多少个查询,并且有很多这样的方法,我们需要分析。所以这就是我想出的
try (Connection conn = new LogCountConnection(getConnection)) {
// Do some queries here
}
LogCountConnection 基本上将其所有调用传递给标准实现,但对于某些方法,它会增加计数器值,并且 close 方法被覆盖,如下所示:
@Override
public void close() throws SQLException {
log.info(String.format("Number of queries executed: %d", counter));
conn.close();
}
但是,它看起来非常乏味,我必须实际创建一个全新的类,那里的方法大多如下所示:
@Override
public boolean getAutoCommit() throws SQLException {
return conn.getAutoCommit();
}
这绝对看起来像AOP中的东西,但我们没有在我们的项目中使用AspectJ或类似的东西。我可以为此使用mockito对现有对象上的方法进行部分模拟吗,或者风险太大,应该只在测试中严格使用吗?
正如评论中已经指出的那样,嘲笑或间谍活动很可能无法解决您的问题。
在您的用例中,可以通过实现动态代理来避免经典委托。仅拦截Connection
接口的一些方法可以通过InvocationHandler
中的分支。文章 https://jaxenter.de/jdbc-treiber-selbstgebaut-java-trickkiste-636(不幸的是只有德语)概述了与您的类似问题的解决方案。