2015-12-16 11 views
10

は、以下の方法で考えてみましょう:私はこのコードを書いていないメソッドを実行せずにメソッド呼び出しと戻り値をモックする方法はありますか?

public boolean isACertainValue() { 
     if(context.getValueA() != null && context.getValueA().toBoolean() == true) { 
     if(context.getType() != null && context.getType() == ContextType.certainType) { 
      return true; 
     } 
    } 
    return false; 
} 

を、それは地獄のように醜いですが、それは完全にovercomplicatedですが、私はそれで働かなければなりません。

今、私はこのメソッドの呼び出しに依存するメソッドをテストしたいと思います。

私はでこれに対処できると思っていた:それは私がテストしたい場合だから

Mockito.when(spy.isACertainValue()).thenReturn(true);

しかし、それはまだ方法-体を呼び出しているとして、それは動作しません:/

私はnullpointersを取得したり、むしろ私は

misusing.WrongTypeOfReturnValueの線に沿って何かを得ます。ブール値はgetValueA()によって返されません。

Mockito.when(contextMock.getValueA()).thenReturn(new ValueA());Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType);

が、その後、私は私ができるように思われるカントnullポインタを取得します: getValueAは()ValueA

を返す必要がありますので、私は何をする(回避策として)みましたデバッグする。

この場合、どのようにして正常に処理されますか?

+1

それを行う方法を正確ですが、多分あなたは、あなたのテストで、さらに上の必要があることvalueAの値がありますので、あなたもオブジェクトが、返されないだけのリターンモック必要があります(デフォルトの)コンストラクタでインスタンス化されたインスタンス – Stultuske

答えて

13

あなたは

Mockito.when(spy.isCertainValue()).thenReturn(true); 

isCertainValue()がここに呼ば取得されたメソッドを呼び出しています。これがJavaの仕組みです:引数がMockito.whenであることを評価するには、spy.isCertainValue()の結果を評価してメソッドを呼び出す必要があります。

Mockito.doReturn(true).when(spy).isCertainValue(); 

これは、同じモック効果を持つことになりますが、この方法では、こので呼び出されることはありません:あなたはそれが起こるしたくない場合は

、あなたはthe following constructを使用することができます。

+0

ありがとう、私は今、もっと軌道に乗っている...私はxDのnullpointerを取得する私はこのプログラムをそんなに憎む、それは嫌悪感だ:X – Sorona

+0

壊れたリンク。どこにスパイを設定しますか? – powder366

+0

それは私のために働いた。それはNPEの投げをやめた。おかげでTunaki! – Dish

0

このコードは正しいです:

Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType); 

しかし、あなたが定義する必要がありますモッキング値を定義していないので、あなたがNullPointerExceptionが取得している、私は@Autowiredを定義するときだけでなく、私は私のコンテキストファイルに春を、使用しています豆私はそれをこのように定義する:

<bean id="contextMock" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="com.example.myspringproject.bean.ContextMock" /> 
</bean>