2017-12-10 19 views
0

春には初めてです。私のGCGoodクラスはCrudRepositoryと共にMySQL-DBに保存されます。それはうまく動作します。CrudRepositoryを正しい方法で模擬する方法は?

今、JUnit-Testを作成しようとしています。もちろん、私のデータベースにはテストデータがありません。だから、私はテストを書いた:

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class GCGoodTests { 

    @MockBean 
    private GCGoodRepository goodRepository; 

    @Test 
    public void getterSetterTest() 
    { 
     GCGood testDummy = new GCGod(); 
     testDummy.setAttribute("Muhaha"); 
     testDummy.setColor(Color.BLACK); 
     testDummy.setName("Maka"); 
     testDummy = goodRepository.save(testDummy); 
     Iterable<GCGood> testDummy2 = goodRepository.findAll(); 
     assertEquals(testDummy.getAttribute(), "Muhaha"); 
     assertEquals(testDummy.getColor(), Color.BLACK); 
     assertEquals(testDummy.getName(), "Maka"); 
     assertNotNull(testDummy.getId()); 
     assert(testDummy.getId()>0); 
     assertNotNull(testDummy2); 
    } 
} 

Unfortuantelly "testDummy = goodRepository.save(testDummy);" と "反復処理可能testDummy2 = goodRepository.findAll();は" nullを返し、テストが終了しさえいけません。

@MockBeanを@Autowireに変更すると、すべて正常に動作します。しかし私のデータベースには不要なデータshmoddaがあります。

したがって、data-shmoddaなしでcorretテストを達成するにはどうすればよいですか?

答えて

1

統合テストをしたいようです。その場合は、アノテーションを使用して、メモリ内のデータベースを使用してテストを実行できるときに、環境用に作成する必要があります。詳細はdocumentationをご覧ください。

テストする内容によっても異なります。リポジトリ(GCGoodRepository)がテストターゲットの場合は、@Autowiredとする必要があります。上記のように、メモリデータベース内の一部を使用して隔離環境でテストしてください。いくつかのリポジトリ(例えばGCGoodRepository)に依存するサービスをテストする場合、このリポジトリを@karthiと同じようにモックする必要があります。

+0

ありがとう!その "メモリデータベース"問題が問題でした。 @ DataJpaTestではうまく動作します! – Tagamoga

1

mocked-beanを注入したにもかかわらず、実際には模倣されなければならないメソッドと、mocked-beanで何らかのメソッドを呼び出す場合に期待されるものについては言及していません。あなたにできることはちょうどこのよう@Beforeメソッドを記述し、次のとおりです。

@Before 
public void setup() { 
     List<GCGood> gcgoods = Collections.emptyList(); 
     given(goodRepository.findAll()).willAnswer(gcgoods); 
} 

与えられた()とwillAnswer()を使用すると、インポート静的org.mockito.BDDMockitoてインポートすることができ、BDDMockitoです。*;

+0

ありがとうございました。しかし、私は特別な機能だけを模擬したくないのですが、lucascodeが示唆しているようにDBを「メモリ内」に転送します! – Tagamoga