キャスト操作からモックを返す、Mockito、ジャワ

セバスチャン:

私は、テストしようとしていることを、ここで、このコードを持っています:

public class Something {
    public String doSomething(MyClass myClass) { 
        return Utils.getPresentationString(myClass)
    }
}

public class Utils{
    public static String getPresentationString(MyClass myClass) {
        if (myClass instanceof MySubClass) {
            MySubClass mySubClass = (MySubClass) myClass;
            return mySubClass.getMaskedPresentationString();
        } else {
            return myClass.getPresentationString();
        }
    }
}

Utilsのが静的であるため、何かのクラスをテストしながら、私はブラックボックス的にそれをテストしています。

私は、コードリターンモックのこのラインを持ってしようとしています:

MySubClass mySubClass = (MySubClass) myClass;

だから私は行うことができます

doReturn(MY_MASKED_STRING).when(this.mySubClassMock).getMaskedPresentationString()

その後、やります

assertEquals(MY_MASKED_STRING, this.somethingUnderTest.doSomething(this.myClassMock))

私は、この作品のような何かをするにはどうすればよいです

doReturn(this.mySubClassMock).when(this.myClassMock).<<cast to MySubClass.class>>
GhostCat敬礼モニカC.:

ラインがキャストであること、それはまだ存在しないものを返すことはできません。しかしその後。

public static String getPresentationString(MyClass myClass) {
    if (myClass instanceof MySubClass) {

それは単にそのクラスに入ってくるオブジェクトです。

したがって、あなたは、単に必要があります。

MySubClass subclassMock = mock(MySubClass.class);
...

objectUnderTest.getPresentationString(subclassMock);

そして、本番コードは喜んで、「それはinstanceofのである」行き、その後、キャスト、あなたにその入ってくるオブジェクトを完全に制御を与える必要があります。

しかし注意:ここで「本当の」OOPの道:ないようにすることをinstanceofは/キャスト!

return mySubClass.getMaskedPresentationString();
... else
return myClass.getPresentationString()

なぜ、あなたのサブクラスはありませんオーバーライドし getPresentationString()、他の値を返すために、?それは間違っているだろう場合は、その後、2つの実装を持っていることをいくつかの「ベース」抽象メソッドを持つことが可能になります!

長い話を短く:

  • 直接の答えは次のとおりです。単純にどちらかで何かを渡すmock(MyClass.class)か、mock(MySubClass.class)あなたがテストする予定のパスに応じて、
  • しかし、はるかに良い:まったくそのinstanceofは/鋳造部品を取り除きます。良いOOPの全体のポイントは、まさにそのようなコードを避けるためです!

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=315987&siteId=1