2017-03-23 5 views
3

これは私のサービスのコードです:私は、単純なユニットテストを書きたいモッキング例外:予期しない例外エラー

public class Service { 
    public Object serviceMethod() throws MyException { 
     @Autowired 
     Dao dao; 

     try { 
     return dao.dao_method(); 
     } catch (ExceptionFromDaoMethod e) { 
     throw (new MyException()); 
     } 
    } 
} 

。私は予期しない例外を持っているので、

@Mock 
Dao dao; 

@InjectMocks 
Service service; 

@Test(expected=MyException.class) 
public void shouldReturnMyException throws MyException { 
    when(service.serviceMethod()).thenThrow(new MyException()); 
} 

このテストは、失敗します:これは私のテストケースである

予想される例外はMyExceptionがあるが、 org.mockito.exception.base.MockitoException

ました

なぜですか?解決策は何ですか?

更新私は本当のクラス対なく嘲笑1対とき条件を使用していたことに注目している@Maciejコワルスキーに 感謝。 ユニットテストのサービスに注釈@Spyを追加しました。
新しいテストのコードです:

@Mock 
Dao dao; 

@InjectMocks 
@Spy 
Service service; 

@Before 
MockitoAnnotations.initMocks(this); 

@Test(expected=MyException.class) 
public void shouldReturnMyException throws MyException { 
    doThrow(new MyException()).when(service.serviceMethod()); 
} 

しかし、今、私はこの問題を持っている:予想される例外はMyExceptionある

しかし

答えて

1

たあなたは@spyしなければなりません実際の実装が呼び出されてインスタンスとして使用していると仮定して、サービス。

だから、これを試してみてください。

@InjectMocks 
@Spy 
Service service; 

@Test(expected=MyException.class) 
public void shouldReturnMyException throws MyException { 
    doThrow(new MyException()).when(service).serviceMethod(); 
} 

は@SpyをあざけるときdoXXで始めることを忘れないでください。

更新

あなたは(より良いテスト候補..です)DAOコールを模擬したい場合は、あなただけのプレーンなMockitoを使いたい場合は、いくつかの変更を加えなければならないでしょう。

DAOは、あなたのインスタンス依存でない場合、あなたはPROD方法を変更する必要がありますが:

public class Service { 
    public Object serviceMethod() throws MyException { 
     Dao dao = getDaoInstance(); 
     try { 
     return dao.dao_method(); 
     } catch (ExceptionFromDaoMethod e) { 
     throw (new MyException()); 
     } 
    } 

    Dao getDaoInstance(){ 
     return new Dao(); 
    } 
} 

そして、あなたのテストクラス必要があり、私は多かれ少なかれ、このような:

@Mock 
Dao dao; 

@Spy 
Service service; 

@Test(expected=MyException.class) 
public void shouldReturnMyException throws MyException { 
    doReturn(dao).when(service).getDaoInstance(); 

    when(dao.dao_method()).thenThrow(new ExceptionFromDaoMethod()); 

    service.serviceMethod(); 
} 
+0

私の解決策が間違っているなぜあなたは私を説明してもらえますか?さらに、あなたのsolutonでは(service.serviceMethod())またはwhen(service).serviceMethod()? – PenguinEngineer

+0

予期しない例外はMyExceptionが予想されますが、 PenguinEngineer

+0

MockまたはSpyとしてではないインスタンスをモックしようとしていたので、影響がないか、Mockito例外が発生します。そして、あなたがスパイの方法を嘲笑しているときはそうです.when(service).serviceMethod(); '構文。 –

0

最後に、私は、解決策を見つけました:Springプロジェクトの単体テストを作成するのは、少なくともMockitoフレームワークのみを使用しているので、私が予想していたよりも難しいので、いくつかのSpring Annotationを使って解決策を見つけました。

これが私の新しい作業テストです:

@MockBean 
Dao dao; 

@Autowired 
Service service; 

@Test(expected=MyException.class) 
public void shouldReturnMyException throws MyException { 
    when(dao.dao_method()).thenThrow(new ExceptionFromDaoMethod()); 
} 
関連する問題