19

JUnitテストにMockitoを使用しています。したがって、テストしたいコードから使用される特定のクラスAがあります。

class A{

    public A(){}

    public final String a(String x){
        return "A.a: " + x;
    }

}

そして、メソッド呼び出しAaを、同じ引数と同じタイプの戻り値を持つ別のメソッド呼び出しに置き換えたいと思います。ご覧のとおり、finalであるため、クラスを拡張してメソッドaをオーバーライドすることはできません。だから私が今持っているのはメソッドBbを持つ別のクラスBです:

class B{

    public B(){}

    public String b(String x){
        return "B.b: " + x;
    }

}

ここで、コードからAaが呼び出されるたびに、代わりにBbの戻り値が使用されることを確認したいと思います。xの値を知らなくても、Mockito(のようなものMockito.when(A.a(x)).thenReturn(B.b(x));)で同じパラメーターxを使用してこれを達成する可能性はありますか?

助けていただければ幸いです、よろしくお願いします!

4

3 に答える 3

22

mockitoモックは、クラスを拡張し、メソッドをオーバーライドすることで機能します。これは、あなたの場合は不可能A.a(String)です。これを実現したい場合は、最後の修飾子を削除する必要があります。

A.a(String)、最終的ではないと仮定すると、あなたが求めることは、mockitoで完全に実行可能です:

given(mockA.a(anyString()).willAnswer(returnOfB(bInstance));

Answer<String> returnOfB(final B bInstance) {
    return new Answer<String>() {
         public String answer(Invocation invocation) {
             String arg = (String) invocation.getActualArguments()[0];
             return bInstance.b(arg);
         }
    };
}

この回答は電話で書かれており、タイプミスや間違った名前が付いている可能性があることに注意してください。ただし、目的を達成するために何をすべきかを理解する必要があります。

乾杯

于 2012-08-23T09:30:23.190 に答える
3

Mockitoの制限によると、Mockitoで生成されたモックのfinalメソッドをオーバーライドすることはできません。ただし、Powermockを使用して実行時にコードをハッキングし、Mockitoがその仕事を行えるようにすることができます。

于 2012-08-23T09:27:48.313 に答える
1

基本的に、私はあなたのセットアップを取り、それを使ってユニットテストを書きました。最初にポップアップしたのは、これを明示的に示すエラーメッセージでした。

org.mockito.exceptions.misusing.MissingMethodInvocationException:when()には、「モックのメソッド呼び出し」でなければならない引数が必要です。

そして、トレースの後半で、「final / private / equals()/ hashCode()メソッドのいずれかをスタブします。これらのメソッドはスタブ/検証できません」と記載されています。

したがって、Mockitoによると、finalメソッドをスタブ化することはできません。それだけです。

編集:したがって、最後の修飾子を削除するか、このクラスをそのまま使用する場合は、別の方法を見つける必要があります。

于 2012-08-23T09:30:47.733 に答える