私はテストケースを書くためにJunitを練習していて、依存オブジェクトをモックできるMockitoに出会いました。そのため、動作をテストするためのサンプルコードを作成しました。
SampleとSecondの 2つのクラスがあります。
2番目のクラスには、このメソッドにパラメーターとして渡される文字列を返すだけの単純なメソッドがあります。
public class Second{
public String show(String y ){
return y
}
}
これで、Sampleクラスのメソッド内でこのshowメソッドを呼び出し、文字列を返すSampleクラスがあります。
public class Sample{
public String sampleMethod(){
Second s = new Second();
return s.show("This should not be displayed");
}
}
これでSampleクラスをテストしているので、SampleTestという名前のファイルを作成しました
public class SampleTest{
@Mock
Second s;
@InjectMocks
Sample s = new Sample();
@Before
public void setUp(){
MockitoAnnotations.initMocks(this);
when(s.show(any(String.class))).thenReturn("This should be displayed");
}
@Test
public void sampleMethodTest(){
assertEquals("This should be displayed", s.sampleMethod());
}
}
Secondクラスのオブジェクトが作成され、そのメソッドがSampleメソッド内で呼び出されているので、Secondクラスをモックし、モックをSampleに注入しました。
次に、Beforeメソッド内にwhenとthenReturnステートメントを記述します。
2番目のオブジェクト内でshowメソッドを呼び出すと、「これを表示する必要があります」という希望の出力が返されました。
しかし、出力はwhenおよびthenreturnステートメントを呼び出す代わりに、私が期待したものではなく、Secondオブジェクト内の実際のshowメソッドが呼び出されます。
メソッドを作成したオブジェクトをモックできません。
それ、どうやったら出来るの?
そして、私はpowermockitoではなくmockitoでのみ行う必要があります
Sample
Second
テスト中のメソッド内で作成することにより、密に結合されます。
現在述べられている制限を考えると、
そして、私はpowermockitoではなくmockitoでのみ行う必要があります
MockitoはSecond
内で使用されているものをモックできませんSample
。
Sample
コンストラクターインジェクションを介した明示的な依存関係の原則などのよりソリッドな設計に従うようにリファクタリングできる場合。
public class Sample {
private final Second second;
public Sample(Second second) {
this.second = second;
}
public String sampleMethod(){
return s.show("This should not be displayed");
}
}
次に、依存関係をモックして、テスト中のサブジェクトクラスに注入できます。
public class SampleTest {
@Mock
Second second;
@InjectMocks
Sample sample; //second will be injected here
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void sampleMethodTest() {
//Arrange
String expected = "This should be displayed";
when(second.show(any(String.class))).thenReturn(expected);
//Act
String actual = sample.sampleMethod();
//Assert
assertEquals(expected, actual);
}
}
テストの変更に注意して、テストを実行したときに期待どおりに動作するようにします。
リファクタリングできない場合Sample
、powerMockito はクラスの初期化をモックできます。
powerMockitoはそのようなことを可能にしますが、設計の選択の悪さや密結合のようなコードの臭いを助長するため、コードの保守や分離テストを困難にします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加