2015-09-26 7 views
9

FooMockUpのサンプルを考えてみてください。は、コンストラクタ内でBarを傍受した後、BarとしてtoString()を実装しています。JMockit MockUpのmock toString()を使用できますか?

public class FooStub extends MockUp<Foo> { 

    private Bar bar; 

    @Mock 
    public void $init(Bar bar) { 
     this.bar = bar; 
    } 

    @Mock 
    public String toString() { 
     return bar.toString(); 
    } 
} 

Fooた場合は、すべてが正常に動作toString()オーバーライドするために発生します。しかしそれ以外の場合は、IllegalArgumentException:「次のモックでは実際のメソッドと一致しません」と表示されます。私はここから、JMockitは基底クラスを調べていないので、模擬する方法はtoString()ではないことを理解しています。

私はFooクラスを変更できないとします(現実には、議論のためだけですが)クラスのためにtoString()を模擬する方法はありますか?

明確にするには、このクラスのすべてのインスタンスを模擬したいと思います。ただ1つのインスタンス(簡単な解決策はありません。MockUpは不要です)。

+2

[Jmockit:net.android.UriクラスのtoStringメソッドを模倣できない](https://stackoverflow.com/questions/41561351/jmockit-cant-mock-method-tostring-of-net-アンドロイド - ウリ - クラス) – Jotunacorn

答えて

0

JMockitは、までのクラス階層をすべてのスーパークラスをモックアップが、java.lang.Objectを除います。

private final class Baz extends Bar { 
    @Override 
    public String toString() { 
     return super.toString(); 
    } 
} 

を今、あなたはあなたのモックにしなければならないすべてはBaz経由で委任することです:

あなたはsuper.toString()を呼び出すことによってBartoString()へのデリゲートがtoString()をオーバーライドすることでBarを拡張して、あなたのテストでprivate finalクラスを定義することができますBarではありません。

このようにして、toString()の具体的で透明なインプリメンテーションを得ることができます。Barクラスに触れることなくモックできます。

関連する問題