2013-03-26 92 views
2
的Mockito

抽象基类的行为我有这样的代码:如何覆盖与

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(); 
    } 
} 

我想测试的MyCallback行为时doIt()被调用。我使用Mockito创建一个模拟外部,然后可以得到external.doSomething()执行MyCallback.somethingHappened。我可以在第4行将呼叫的返回值控制为super.someCondtion吗?我可以重新安排实施以提高可测性吗? ExternalExternalAbstractCallback的实现无法更改。

回答

3

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

解决方法:

  • 添加的getter/setter回调。
  • 移动new MyCallback()到一个新的受保护的辅助方法,您在您的测试
+0

+1覆盖的第一句话。但是为MyCallback添加getter/setter似乎是不可能的,因为MyCallback是一个内部类。 – 2013-03-26 17:37:43

+0

什么阻止你提取内部类? – 2013-03-27 08:36:58

+0

那么?做你需要改变的东西[包私人](http://stackoverflow.com/questions/215497/in-java-whats-the-difference-between-public-default-protected-and-private)。 – 2013-03-28 11:42:12