4
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を使用しましたが、コードカバレッジを使用すると、メソッドが呼び出されたことを検出しません。私は何か間違ったことをしていますか?助けてください!

4

3 に答える 3

18

本番コードに対して行っている唯一の呼び出しをモックアウトしているようです。

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

  • を呼び出すとsaveData()、結果を偽ってtrueを返します
  • 今すぐ電話してくださいsaveData()-そうです、結果は本当でした!

私が見る限り、あなたのプロダクションコードはまったく呼び出されていません。

モックのポイントは、本番クラスから依存関係をモックアウトすることです。または(場合によっては、私はしたくないのですが)、実際にテストしているコードが呼び出す本番クラスのいくつかのメソッドをモックアウトすることです。

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

于 2010-09-11T06:24:32.507 に答える
7

私があなたの質問を正しく理解していれば:

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

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

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

しかし、これがクラスA自体をモックしているケースです。つまり、何もテストしていないということです。

于 2010-09-11T06:24:50.567 に答える