私はかなりの記事/ブログ/ StackOverflowの質問を読んだが、Mockitoモックとスパイに関する混乱は依然として残っている。そこで、私は小さなSpring Boot
アプリで実装しようと試みました。私のアプリのProductRepository
はCrudRepository
です。SpringBoot App内のMockitoモックとスパイ
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {RepositoryConfiguration.class})
public class ProductRepositoryMockTest {
@Mock
private ProductRepository productRepository;
@Mock
private Product product;
@Test
public void testMockCreation(){
assertNotNull(product);
assertNotNull(productRepository);
}
@Test
public void testSaveProduct() {
assertThat(product.getId(), is(equalTo(0)));
when(productRepository.save(product)).thenReturn(product);
productRepository.save(product);
//Obviously this will fail as product is not saved to db and hence
//@GeneratedValue won't come to play
//assertThat(product.getId() , is(not(0)));
}
@Test
public void testFindProductById() {
when(productRepository.findOne(product.getId())).thenReturn(product);
assertNotNull(productRepository.findOne(product.getId()));
assertEquals(product, productRepository.findOne(product.getId()));
}
}
テストパスを次のように
現在、私はProductRepository
をあざけることにより、リポジトリをテストしています。これは正しい方法ですか?私はまたここで@Spy
の使い方を理解したいのですが、なぜそれが必要なのでしょうか?これに関する特定のシナリオは、大歓迎です。
ありがとうございます。
あなたのリポジトリをテストしないでください。ユニットテストに関するサービスレイヤに焦点を当ててください。あなたがあなたのリポジトリの中にいくつかのロジックを持っているなら、それは恐らく設計の欠陥です。 –
ええ、ポイントを得ました。ありがとう。 – user2693135
@Maciej Kowalski最後に、あなたの入力に基づいてモックとスパイを使用してサービス層をテストしました。しかし、私がそれを正しく行ったかどうかわからない、私のレポはhttps://github.com/ximanta/mockito_spy_exampleです。あなたの観察は貴重です。必要に応じて、これを質問として投稿できます。ありがとう。 – user2693135