7

mockito は CGLIB によって強化されたオブジェクトをモックできないというのは本当ですか?

public class Article {

     @Autowired
     private dbRequestHandler

     @Autowired
     private filesystemRequestHandler

     @Transactional
     public ArticleDTO getArticleContents() {

         //extractText() and then save the data in DTO
         //extractImages() and then save the data in DTO
         // some other calls to other databases to save data in dto

       return articleDTO;

     }
     public void extractText() {

        //call to DB

   }

   public void extractImages() {

        // call to file system

   }
}


public class IntegrationTest {

  @Autowired
  private Article article;

  //setup method {

  articleMock = Mockito.spy(article);

  doNothing().when(articleMock).extractImages();
 }
}

上記の例では、doNothing().when(articleMock).extractImages();実際に実際の関数を呼び出します。記事をよく見ると、Mock は 2 倍に強化されています。の 1 つの原因autowiringと の 2 番目の原因spying

強化されたオブジェクトをスパイできない場合getArticle()、統合テストでメソッドをテストして、適切な DTO が返されることを確認するにはどうすればよいでしょうか。

注:実際には、ファイルシステム呼び出しを行うメソッドをテストしたくありません。DBのものだけです。getArticleそのため、メソッドをテストする必要があります。

4

4 に答える 4

1

AdditionalAnswers.delegatesToメソッドを利用できます。次の例では、「軽量」メソッド委譲を使用することを除いて、secondProxyDoingMocking宣言はスパイのようなものを作成します (メソッドの実装と比較してください)。spy()

import org.mockito.AdditionalAnswers;

public class ArticleTest {

    @Autowired
    private Article firstProxyDoingAutowiring;

    @Test
    public void testExtractImages() {
        Article secondProxyDoingMocking = Mockito.mock(Article.class,
                Mockito.withSettings().defaultAnswer(
                        AdditionalAnswers.delegatesTo(firstProxyDoingAutowiring)
                )
        );
        Mockito.doNothing().when(secondProxyDoingMocking).extractImages();
        ...
    }

}

この例はテストしませんでしたが、実際のコードから組み立てました。@Transactional私の使用例も同様でした。指定されたメソッドに対して定数値を返し、Springアノテーション付き Beanの残りのすべてのメソッドに対して実際のメソッドを呼び出します。

于 2016-07-07T12:26:29.917 に答える
1

すぐに使えるコンパイル可能なコードで質問を更新してください。コード レビューの提案を次に示します。

この質問コードの問題:

  • Article.java のインポートの欠落: org.springframework.beans.factory.annotation.Autowired
  • Article.java のインポートの欠落: org.springframework.transaction.annotation.Transactional
  • Article.java 属性の構文の問題: dbRequestHandler
  • Article.java 属性の構文の問題: filesystemRequestHandler
  • Article.java メソッドには初期化された return ステートメントがありません: articleDTO

上記の問題が修正されたコードを質問するときに使用する必要があるものは次のとおりです。

記事.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

public class Article {

    @Autowired
    private Object dbRequestHandler;

    @Autowired
    private Object filesystemRequestHandler;

    @Transactional
    public ArticleDTO getArticleContents() {

        // extractText() and then save the data in DTO
        // extractImages() and then save the data in DTO
        // some other calls to other databases to save data in dto

        ArticleDTO articleDTO = null;
        return articleDTO;

    }

    public void extractText() {

        // call to DB

    }

    public void extractImages() {

        // call to file system

    }
}

IntegrationTest.javaは汎用的であるため、testClass の名前としては適切ではありません。Java単体テストにはArticleTestをお勧めします。

ArticleTest.java

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.beans.factory.annotation.Autowired;

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithPrivate.class)
public class ArticleTest {

    @InjectMocks
    private Article cut;

    @Mock
    private Object dbRequestHandler;

    @Mock
    private Object filesystemRequestHandler;

    @Test
    public void testeExtractImages() {

        /* Initialization */
        Article articleMock = Mockito.spy(cut);

        /* Mock Setup */
        Mockito.doNothing().when(articleMock).extractImages();

        /* Test Method */
        ArticleDTO result = cut.getArticleContents();

        /* Asserts */
        Assert.assertNull(result);

    }

}
于 2013-11-10T17:31:02.207 に答える