現在のオブジェクトの別のメソッド(のキーワードを使用)を呼び出すSLSBのメソッドをテストする必要があり、何とかスタブする必要があります。'this'キーワードを使用して呼び出されるMockitoスタブメソッド
単純化されたコードは、次の点を考慮:
@Local
public interface SomeService{
public int someMethod();
public int anotherMethod();
}
@Stateless()
public class SomeServiceImpl{
@EJB
private SomeDAO sDAO;
public SomeServiceImpl(){}
public SomeServiceImpl(SomeDAO sDAO){
this.sDAO = sDAO;
}
@Override
public int someMethod(){
int dbValue = sDAO.getSomeDBValue(); // 1st stub required here
return dbValue + this.anotherMethod(); // 2nd stub required here
}
@Override
public int anotherMethod(){
return 5;
}
}
私は@Mockと@InjectMocks注釈で、このクラスにモックを注入することができますが、私は正しくanotherMethod(スタブする方法を見つけ出すことはできませんgetSomeDBValue()メソッドをスタブに) 。それをスタブするにはモックオブジェクトでそれを行う必要があるので、パラメータとして現在のオブジェクトへの参照を渡そうとしました。私の方法は、(スタブDAOメソッドに必要としない)、このようになります。たとえば ...
@Override
public int someMethod(SomeServiceImpl sS){
return sS.anotherMethod();
}
次のようになり、手動で作成したモックと私のテスト:メソッドをモックで呼び出され
@Test
public void someMethodTest() throws Exception {
SomeServiceImpl sS = mock(SomeServiceImpl.class);
when(sS.someMethod(any(SomeServiceImpl.class))).thenCallRealMethod();
when(sS.anotherMethod()).thenReturn(5);
assertEquals(5, sS.someMethod(sS));
}
オブジェクト自体への参照はパラメータとして渡され、anotherMethodはスタブされます。それは働いていたが、このような注釈使用して私のDAOのモックを注入する必要がある場合、それは非常に醜いソリューションとどのようだ:私は@InjectMocksアノテーションは@Mockで注釈さモッククラスを示すために使用されて理解したよう
@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest{
@Mock
SomeDAO sDAO;
//@Mock //I can't use those 2 annotations at once
@InjectMocks
SomeServiceImpl sS;
@Test
public void someMethodTest() throws Exception {
//...
}
}
が注入されなければなりません私の醜い解決策のためには、私はSomeServiceImplも模倣する必要があります。
私の解決策は正しいか?私はsomeMethod()を正しくテストするためにanotherMethod()をスタブするとしますか?メソッドの引数でテストするクラスのインスタンスを渡すことをお勧めしますか?はいの場合、アノテーション付きモックを作成するにはどのように対処すればよいですか?
オブジェクトunterテストで 'Mockito.spy'ラッパーを使用してください。 –