Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我是否可以使用mockito部分重写现有对象(而不仅仅是测试)?_Java_Mockito_Aop - Fatal编程技术网

Java 我是否可以使用mockito部分重写现有对象(而不仅仅是测试)?

Java 我是否可以使用mockito部分重写现有对象(而不仅仅是测试)?,java,mockito,aop,Java,Mockito,Aop,我有一个问题。我有一个使用连接实现的方法。也就是说,该方法如下所示: try (Connection conn = getConnection()) { // Do some queries here } @Override public void close() throws SQLException { log.info(String.format("Number of queries executed: %d", counter)); conn.close(); } @Ov

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

try (Connection conn = getConnection()) {
  // Do some queries here
}
@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();
}
然而,我们需要有一个精确的统计数据,这个方法执行了多少查询,我们需要分析很多这样的方法。这就是我的想法

try (Connection conn = new LogCountConnection(getConnection)) {
  // Do some queries here
}
LogCountConnection基本上将其所有调用传递给标准实现,但对于某些方法,它会增加计数器值,close方法被覆盖如下:

try (Connection conn = getConnection()) {
  // Do some queries here
}
@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();
}
然而,它看起来非常乏味,我必须实际创建一个全新的类。这些方法主要如下所示:

try (Connection conn = getConnection()) {
  // Do some queries here
}
@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对现有对象上的方法进行部分模拟吗?或者风险太大,只能在测试中严格使用?

正如评论中已经指出的,模拟或监视很可能不会解决您的问题


在您的用例中,通过实现动态代理,可以避免经典的委托。通过
InvocationHandler
中相应的分支,只截取
连接
接口的一些方法成为可能。这篇文章(不幸的是只有德语)概述了一个与你类似的问题的解决方案。

你知道模仿的作用吗?它基本上创建了一个伪代码,而不是实际运行的代码。在我看来,您似乎在寻找一个静态方法。/Factory不完全是,您可以在spy()帮助下对真实对象进行模拟。不知道为什么您会认为自定义类“乏味”。这基本上只是经典的委托…我同意,这是经典的委托,然而连接接口有几十个方法,为它创建一个完整的类看起来真的是一件乏味的工作,尽管我做了。我只是好奇,在Java中是否有更优雅的方法可以做到这一点谢谢,代码非常清楚,现在我知道该怎么做了。如果您想避免动态代理的性能开销以及它们无法处理内部方法调用(类a中的方法调用同一类中的另一个方法),您可以将AspectJ用于此横切关注点。AOP的美妙之处在于,如果您不需要方面,甚至可以停用它,如果做得正确,您的核心代码完全不知道它。