7

私は次のクラスを持っています:

public abstract class AbstractParent {
    static String method() {
        return "OriginalOutput";
    }
}

このメソッドをモックしたい。JMockitを使用することにしました。そこで、モック クラスを作成します。

public class MockParent {
    static String method() {
        return "MOCK";
    }
}

そして私のテストコードは次のようになります:

public class RealParentTest {

    @Before
    public void setUp() throws Exception {
        Mockit.redefineMethods( AbstractParent.class, MockParent.class );
    }


    @Test
    public void testMethod() {
        assertEquals(MockParent.method(),AbstractParent.method());
    }

}

残念ながら、このテストでは、AbstractParent は "MOCK" ではなく "OriginalOutput" を返します。理由はありますか?私は何か間違ったことをしていますか?モッククラスも抽象として宣言しようとしましたが、役に立ちませんでした。

編集メソッドを公開すると、テストが問題なく実行されることに注意してください... JMockitでは、任意のスコープのメソッドをモックできるはずなので、これは奇妙です。

回答モック メソッドのみをパブリックにする必要があります。元のメソッドはそのままにしておくことができます。

4

2 に答える 2

6

解決策を見つけました:モックのメソッドを公開するだけです(元のメソッドは元の可視性を維持できます)。

元の方法では機能しないのに、なぜこれが機能するのかはわかりません (機能する人は大歓迎です)。ただし、上記の例のモック クラスを次のように変更するだけです。

public class MockParent {
    public static String method() {
        return "MOCK";
    }
}
于 2008-10-22T07:42:24.330 に答える
4

どうやらこれを行う新しい方法は、MockUp<T>

new MockUp<AbstractParent>(){
    @Mock String method() {
        return "MOCK";
    }
};

assertEquals("MOCK" AbstractParent.method());

MockParentもう1つの選択肢は、注釈のようなものを続けること@MockClassです。別のインラインバージョンが仕事をするので、これを自分でやったことがありません。

これを githubのサンプル プロジェクトに実装しました。

于 2010-12-14T13:49:48.910 に答える