0


1

Mockitoは合格するが、コードカバレッジはまだ低い
package com.fitaxis.test;

import java.sql.SQLException;

import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

import static org.mockito.Mockito.*;

import com.fitaxis.leaderboard.LeaderBoard;

public class LeaderBoardTests {


 @Test
 public void TestThatDataIsSavedToTheDatabase()
 {
  LeaderBoard leaderBoard = mock(LeaderBoard.class);
  //doNothing().doThrow(new RuntimeException()).when(leaderBoard).saveData();

  when(leaderBoard.saveData()).thenReturn(true);

  boolean res = leaderBoard.saveData();

  verify(leaderBoard).saveData();

  Assert.assertTrue(res);
 }

}

私はmockitoを使用してクラスをモックしましたが、コードカバレッジを使用すると、メソッドが呼び出されたことを検出しません。 私は何か悪いことをしていますか? 助けてください!

3 Answer


9


実動コードに対して行っている唯一の呼び出しをモックしているように見えます。

言い換えれば、あなたのテストは言う:

  • `saveData()`を呼び出すと、結果を偽ってtrueを返します

  • 次に、 `saveData()`を呼び出します。いや、結果は真でした!

私の知る限り、あなたの製品コードは一切コールされていません。

モックのポイントは、プロダクションクラスから依存関係をモックアウトすることです。または、実際にはテストしているコードが呼び出すプロダクションクラスのメソッドをモックアウトすることもあります。

「Leaderboard」自体ではなく、「Leaderboard」の依存関係をモックアウトする必要があります。 `saveData()`をモックアウトする必要がある場合、 `saveData()`を呼び出すメソッドをテストする必要があります…​ 適切なデータを保存していること、 `saveData()`がfalseを返したときに正しく動作することなどを確認してください。


4


あなたの質問を正しく理解したら:

LeaderBoardをard笑しているからです。 それはあなたがそれをテストしていないことを意味します。

LeaderBoardをテストする場合は、模擬クラスではなく実際のクラスをテストする必要があります。

クラスAをテストしたいが、このクラスはBに依存しているとしましょう。Bはテスト環境でインスタンス化するのが少し難しいです(何らかの理由で)。 このような場合、Bをモックできます。

ただし、クラスA自体をモックしている場合は次のとおりです。 つまり、何もテストしていません。


0


ランナークラスをMockitoJUnitRunnerとして追加します。以下のサンプルコードを参照してください

import org.mockito.junit.MockitoJUnitRunner

@RunWith(MockitoJUnitRunner.class)
public class MockitTesterClass{
    @Mock
    private TestService testServiceMock;
}

今、コードカバレッジが増加します