我可以使用 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(遗憾的是只有德语)概述了与您的问题类似的解决方案。
我有以下问题。我有一个使用 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(遗憾的是只有德语)概述了与您的问题类似的解决方案。