1

クラス内に多数のコレクションを作成する必要があるクラスのJMockテストを作成しています。必要に応じてコレクションを生成するファクトリをクラスに提供しています。

interface Factory
{
    <T> Collection<T> newCollection();
}

class MyClass
{
    public MyClass(Factory f)
    {
        List<ThingA> la = f.newCollection();
        List<ThingB> lb = f.newCollection();
    }
}

これで動作しますが、JMockを使用して「MyClass」をテストする場合、この戻り型のオーバーロードをモックすることはできません。

Collection<ThingA> ta = new LinkedList<ThingA>();
Collection<ThingB> tb = new LinkedList<ThingB>();
Collection<ThingC> tc = new LinkedList<ThingC>();

Factory mockFactory = context.mock(Factory.class);
context.checking(new Expectations()
{
    {
        allowing(mockFactory).newCollection(); will(returnValue(ta));
        allowing(mockFactory).newCollection(); will(returnValue(tb));
        allowing(mockFactory).newCollection(); will(returnValue(tc));
    }
}
);

// All return ta
Collection<ThingA> ta2 = mockFactory.newCollection();
Collection<ThingB> tb2 = mockFactory.newCollection();
Collection<ThingC> tc2 = mockFactory.newCollection();

これを機能させる方法はありますか?ThingXを引数として渡すことができることは知っていますが、テストのために型チェックをトリガーするだけの場合は、少し無意味に思えます。

私の現在の修正は、newCollectionへの呼び出しの順序を強制するようにシーケンスを追加することですが、これが機能しない状況(ジェネリック型のプーリングなど)を確認できます。

これはできますか?

4

1 に答える 1

1

型消去は、あなたがやろうとしていることの邪魔になっています。あなたが言ったように、私は単にThingX(またはThingX.class)を渡します。残念ながら、型消去では、そのようなハックなことをする必要があります。

コードをジェネリック認識とジェネリック非認識の 2 つのドメインに分割したと考えるのが最善です。後者から前者に物事を接着する必要がある場合、2 つのうちの 1 つを回避する方法はありません (物事を管理する):

タイプチェックをトリガーするためだけにパラメーターを渡すか(あなたが提案したように):

Collection<ThingA> ta2 = mockFactory.newCollection(ThingA.class);
Collection<ThingB> tb2 = mockFactory.newCollection(ThingB.class);
Collection<ThingC> tc2 = mockFactory.newCollection(ThingC.class);

または、ジェネリックを認識しないコードを a) ジェネリックを認識するメソッドにカプセル化し、b)@SuppressWarnings("unchecked")あるドメインから別のドメインに割り当てるときに表示される警告を抑制する注釈を付けます。

class MockFactoryThingie
{
   /**
    *@SuppressWarnings("unchecked")
    */
   Collection<ThingA> newThingACollection()
   { 
     return (Collection<ThingA>) ... your generic-unaware collection thing...   
   }
}

どちらにしてもダサい。型消去であるこの宝石を私たちに与えてくれたJava/JCPの大君主に感謝しなければなりません:)

于 2011-08-22T15:06:00.400 に答える