JMockitで抽象クラスの非パブリック静的メソッドをモックしていますか?

StackOverflow https://stackoverflow.com/questions/224721

質問

次のクラスがあります:

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が" OriginalOutput"を返すと述べています。 「MOCK」の代わりに。なぜアイデアがありますか?私は何か間違っていますか?モッククラスも抽象クラスとして宣言しようとしましたが、役に立ちませんでした。

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

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

役に立ちましたか?

解決

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

これが元の方法では機能しないのになぜ機能するのかはわかりません(誰かがチャイムを歓迎する以上です)、あなたがする必要があるのは上の例のモッククラスを単に変更するだけです:

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

他のヒント

明らかにこれを行う新しい方法は、 MockUp< T>

を使用することです
new MockUp<AbstractParent>(){
    @Mock String method() {
        return "MOCK";
    }
};

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

別の代替手段は、明らかに @MockClass 注釈付きの MockParent のようなものを継続することです。別のインラインバージョンが仕事をしているので、自分でこれをやったことがありません。

これを githubのプロジェクトの例で実装しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top