2017-10-23 3 views
0

私は最近、以下にリンクされているGitHub Repoに見られるようにいくつかの例を読んで使用しました。これは基本的なSpringブートエラーオブジェクトを拡張するためのものです。私はApiError.javaクラスのいくつかのテストを書き込もうとしています、特に#addValidationErrorsにMore Mockito RETURNS_DEEP_STUBS悲しみ

https://github.com/brunocleite/spring-boot-exception-handling/blob/master/src/main/java/com/example/springbootexceptionhandling/ApiError.java

基本的な問題は、私が仕事に値を返すメソッドのチェーンを取得する方法を発見していませんでしたということです。この時点で私のテストは、テストがMockito.whenメソッドを呼び出す行にNullPointerExceptionで死ぬこの時点で...

@Test 
public void addValidationErrors() { 
    ApiError apiError = new ApiError(HttpStatus.OK); 
    ConstraintViolation mockViolation = Mockito.mock(ConstraintViolation.class, Mockito.RETURNS_DEEP_STUBS); 
    Mockito.when(mockViolation.getRootBeanClass().getSimpleName()).thenReturn("MyBeanName"); 
... 

を次のようになります。私は@PrepareForTestのようなさまざまな注釈の組み合わせと、テストの外のmockViolationを@Mockの下で宣言することで、さまざまなランナークラス(Mockito、JUnit4、さらにはPowerMock)を試しました。

答えて

1

あなたの構文が正しいですが、ここではあなたの特定の問題はgetRootBeanClass戻りClass、とMockito は、最終的なクラスを模擬することができないということです。あなたがクラスを模擬するように頼んだとき、Mockitoはすべてのメソッドを(効果的に)オーバーライドし、それらをMockitoコントロールにリダイレクトするサブクラスを生成します。このオーバーライドメカニズムはfinalメソッドとfinalクラス(java.lang.Classなど)を偽装するのに問題がある理由です。

あなたは、これがPowerMockを成し遂げることができるかもしれないが、それは2011年にJohan Haleby's post from [email protected]のように、勧められないです:

私はその意志の混乱ための多くのクラスをモックアップする可能性がないと思いますPowerMock内部のもの。 MockGateway.MOCK_GET_CLASS_METHOD = trueに設定すると、オブジェクトのgetClass()メソッドをどのようにモックすることができます。

私は強くmocking ClassやgetClassメソッドに対して助言します。それ以外の方法で検証してみてください。

ます(「MyBeanと」)新しいクラスを作成し、それを返すためにgetRootBeanClass()を設定することを検討して、予測可能な値を返すgetSimpleNameことについてだけ心配だから。インターフェイスで戻り値をモックするのは非常に簡単で、使用しようとしているのと同じ種類の単純な名前の戻り値を取得します。