2016-12-05 14 views
1

現在のオブジェクトの別のメソッド(キーワードを使用)を呼び出す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()をスタブするとしますか?メソッドの引数でテストするクラスのインスタンスを渡すことをお勧めしますか?はいの場合、アノテーション付きモックを作成するにはどのように対処すればよいですか?

+1

オブジェクトunterテストで 'Mockito.spy'ラッパーを使用してください。 –

答えて

0

メソッドを試しながら、同じクラスの別のメソッドをテストしてはいけません。あなたは理論的にそれを行うことができます(例えば、Mokito spy を使用して)。

この意味で、これは間違ったレベルでこれに近づいています。実際には、テスト対象のクラス内でテスト対象のメソッドが呼び出すその他のメソッドを気にする必要はありません。あなたは、試験に、someMethod()がその契約を履行したとします。それがあなたの実稼働環境でanotherMethod()への電話を必要とする場合...ユニットテストの価値はどれくらいですか?anotherMethod()

別の考え方:懸念事項を分けて、anotherMethod()部分を独自のクラスXに移動します。次に、テスト対象のクラスがXのインスタンスを保持できます。そのインスタンスは嘲笑される可能性があります。

関連する問題