JMockitで抽象クラスの非パブリック静的メソッドをモックしていますか?
-
03-07-2019 - |
質問
次のクラスがあります:
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のプロジェクトの例で実装しました。
所属していません StackOverflow