我可以使用 mockito 部分覆盖现有对象(而不仅仅是用于测试)吗?



我有以下问题。我有一个使用连接实现的方法。也就是说,该方法如下所示:

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(不幸的是只有德语)概述了与您的类似问题的解决方案。

相关内容

最新更新