2016-08-23 4 views
4

私は最近exisitngプロジェクトや問題の直面しているカップルのためのTDDの作業を開始し、それらの一つは、モッキング/ getterメソッドとsetterメソッドなしクラスのプライベート変数をスタブ

の下に記載されて私はで嘲笑するプライベート変数を持っています

以下
private Class<XYZ> cls = XYZ.class; 

この後の「CLS」変数はクラス名

private List create(Class className, Object objectTO, List<String> names) 

Iの方法のいずれかのarugmentとして使用されるようにテストクラスと変数が見えます私は下に次のことで私のテストケース内のプライベート変数iが私のテストクラスを実行すると

  1. java.lang.reflect.Field;
  2. Field field = PowerMockito.field(XYZ.class,"cls");
  3. field.set(XYZ.class, "objectOfXYZClass");

を宣言手順嘲笑プライベート変数を嘲笑することができます知っていると 、私はエラー未満になっています

java.lang.IllegalArgumentException: Can not set java.lang.Class field com.tools.XYZ.cls to java.lang.Class 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164) 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) 
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55) 
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:75) 
at java.lang.reflect.Field.set(Field.java:680) 

誰かが私にこれを手伝ってくれて、私に何が足りないのか教えてください。

PS:私は@preparefortestを使用し、その中のすべての必要なクラスを言及し、設定、クラスのインスタンスに入れ@runwith(powermockrunner.class)

答えて

1
field.set(instanceOfClassXYZ, "") 

を使用して、私のテストクラスを実行しています。クラスではありません。なぜなら、文字列 "objectOfXYZClass"をオブジェクトに設定しているからです。ないクラスクラスに;) と私はあなたがユニットテストが間違って取得している

field.setAccessible(true); 
+0

@ Sarseth ..私のために働いた。私の悪い、filed .set()私は他のやり方でやっていた...ありがとう。 –

2

を追加すると思います。彼らは内部実装のテスト(フィールドやプライベートメソッドなど)ではありません。

ユニットテストは、一般的にのみ、次のことを行う必要があります。

  1. あなたは「テスト中のクラス」あなたのオブジェクトを作成
  2. あなたはそのオブジェクトの公共メソッド呼び出しを。あなたはそれらの呼び出しに結果を「アサート」します(たとえば、ここやそこでは特定の例外を予想します)。言い換えれば

:あなたは非常にあなたの「テスト対象クラス」の外部から見える行動上の唯一のテストにしたいです。そして、あなたは知っている:あなたのクラスは、外部から見える動作を持っていない場合 - あなたはなぜ最初よりも持っていますか?

もちろん、時には「十分に良い」ではない場合もあります。そのような場合、あなたが通常行うこと:を模倣してのオブジェクトを作成するために、いくつかの模造フレームワーク(EasyMockやMockitoのような)に目を向ける。テスト中のクラスをインスタンス化するときにこれらのモックを使用します(依存性注入と呼ばれます)。そうすることで、テスト中のクラスを完全に制御できます。たとえば、モックが期待していたメソッド呼び出しを確認することができます。

長い話題です:はい、テスト中のクラスのフィールドにどうにかしてアクセスすることは可能です。しかし、それはその名前の価値がない単体テストにつながります。これらのテストは、コードの内部をリファクタリングするとすぐに破棄されるためです。その意味で、このようなテストは、現在の実装が期待どおりに機能することを証明するのに役立ちます。しかし、あなたが何かを変更するときはいつでも、あなたは(おそらくより大きい!)部品やテストコードを再加工する必要があります。

最後に、ユニットテストを書くことは、学ぶ必要があるスキルです。そこに入るための最良のリソースの1つは、videosです。

関連する問題