Java 如何用Mockito重写抽象基类行为

Java 如何用Mockito重写抽象基类行为,java,mockito,Java,Mockito,我有这样的代码: class Outer { private External external; class MyCallback extends ExternalAbstractCallback { void somethingHappened() { if (super.someCondition()) { ... }; } } public Outer() { external = ...; } public setExternal(Exte

我有这样的代码:

class Outer {
  private External external;
  class MyCallback extends ExternalAbstractCallback {
    void somethingHappened() { if (super.someCondition()) { ... }; }
  }

  public Outer() {
     external = ...;
  }

  public setExternal(External e) { external = e; } // test support

  public void doIt() {
    external.setCallback(new MyCallback());
    external.doSomething();
  }
}

我想测试调用
doIt()
MyCallback
的行为。我使用Mockito创建一个mock External,然后可以获取
External.doSomething()
来执行MyCallback.something。我可以控制第4行调用
super.somecondition
的返回值吗?我可以重新安排实现以提高可测试性吗?无法更改
External
ExternalAbstractCallback
的实现

您的问题是不能用Mockito模拟
new
。简而言之,您要测试的代码永远不应该调用
new

解决办法:

  • 为回调添加一个getter/setter
  • newmycallback()
    移动到一个新的受保护的助手方法中,您可以在测试中覆盖该方法

+1,第一句话。但是为MyCallback添加一个getter/setter似乎是不可能的,因为MyCallback是一个内部类。是什么阻止了您提取内部类呢?让你需要的东西变异。