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

Can I use mockito for partial overriding of existing objects (not just for testing)?

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

try (Connection conn = getConnection()) {
  // Do some queries here
}

但是,我们需要有一个准确的统计数据,这个方法执行了多少查询,并且有很多这样的方法,我们需要分析。所以这就是我想出的

try (Connection conn = new LogCountConnection(getConnection)) {
  // Do some queries here
}

LogCountConnection 基本上将其所有调用传递给标准实现,但对于某些方法,它会增加计数器值,并且关闭方法会像这样被覆盖:

@Override
public void close() throws SQLException {
  log.info(String.format("Number of queries executed: %d", counter));
  conn.close();
}

然而,它看起来真的很乏味,我必须实际创建一个全新的 class 那里的方法主要是这样的:

@Override
public boolean getAutoCommit() throws SQLException {
 return conn.getAutoCommit();
}

这看起来确实像是来自 AOP 的东西,但我们没有在我们的项目中使用 AspectJ 或类似的东西。我可以使用 mockito 对现有对象的方法进行部分模拟吗,或者风险太大,应该只在测试中严格使用?

正如评论中已经指出的那样,嘲笑或间谍很可能无法解决您的问题。

通过实施动态代理,您的用例中可能可以避免经典委托。通过 InvocationHandler 中的相应分支,可以仅拦截 Connection 接口的某些方法。文章 https://jaxenter.de/jdbc-treiber-selbstgebaut-java-trickkiste-636(遗憾的是只有德语)概述了与您的问题类似的解决方案。