2016-11-01 17 views
1

を使用して変数の値を設定します。は、私が持っているmockito

SomeClass a = spy(SomeClass.class) 

SomeClassprivate int myValueを持っています。

は、私がどのように私はMockitoを使用していることを行うことができますmyVlaue

3に設定したいですか?

(Mockitoではできない場合は、Mockitoを使用しているコードを破棄することなく、私の次善のオプションは何が望ましいですか)。

注:私はそれを行うことができます

  • getMyValue()を模擬することをお勧めしませんが、私はすでに知っています。
  • setMyValue(int newMyValue)を追加しないでください、私はそれを望まないです。
+0

ここでの問題は、あなたのテストがあなたの実装にあまりにも縛られているということです。より良い質問は、「この時間を模擬してこのintについて非常に重要なのは何ですか?」 SomeClassのオブジェクトを適切な値で構築できませんか?実際のインスタンスを偵察するためにspy(myObject)を実行できることは知っていますか? –

+0

@AshleyFrieze SomeClassで実際の関数をテストし、その関数がmyValueを使用するためです。 私はSomeClassが変数そのものの代わりに常にgetMyValue()を呼び出してgetMyValue()を呼び出して3を返すようにコードを変更することができますが、これは安全な方法ではなく、今説明したより高度な機能を探しています。 –

+0

この種のホワイトボックステストは「テストの匂い」です。パブリックインターフェイスを介してクラスの動作をテストしているようには見えません。それは懸念の分離の欠如を示唆している。 –

答えて

2

私がこれまでに思い付いた最良のオプションは反映しています:

Field myVarField = SomeClass.class.getDeclaredField("myVarField"); 
myVarField.setAccessible(true); 
myVarField.set(someClass,3); 
+1

反射が正解です。 '@ InjectMocks'や[最近削除された内部クラスWhitebox]以外では(http:// stackoverflow。com/q/40280918/1426891)、Mockitoはフィールドにはまったく関わっていないので、フィールドアクセスを自分で処理したり、スパイでセッターを呼び出す必要があります。 –

+0

@JeffBowmanは、フィールド・モックをサポートしていないという根拠を持っていますか?それが制限ではない場合、推奨される方法は何ですか? –

+0

mockitoがゲッターを嘲笑してゲッターだけを使うことをお勧めするならば、私は驚くだろう –

1

反射が正解です。 @InjectMocksまたはthe recently removed internal class Whitebox以外では、Mockitoはフィールドにはまったく関わっていないので、フィールドアクセスを自分で処理したり、スパイでセッターを呼び出す必要があります。

私はこれを見たことがありませんが、Mockitoのことを覚えておいてください。インタラクションを記録して検証するためのツールと洗練された構文を提供します。すべてのメソッドをオーバーライドします。フィールドを使用すると、JVMが値を設定するだけなので、記録や検証は行いません。フィールドを使って作業することは、Mockitoの範囲から少し外れて、どのフィールドを変更することができるかについての多くの警告(スタティックではないか、複数の相互作用を検証する)を行うことができます。

Mockitoはゲッターの使用を明示的に推奨していませんが、状態アクセスをオーバーライド/トラッキングすることができるいくつかのシームの1つで、カプセル化のためにJava全体でそれらを使用すると言いたいことがあります。あなたが設定して、このような値は読み取ることができない場合は、次の

mockitoMockWithFields.fieldA = 42; 
return mockitoMockWithFields.fieldB; 

を次にあなたがするMockitoを探しているすべてのは、カプセル化または終局を倒しています。 Mockitoはメソッドのためにネイティブでもどちらでもできないので、自分自身や別のライブラリでそれらを倒すことはおそらくかなり合理的です。