Mockito通过,但代码覆盖率仍然很低

时间:2010-09-11 06:15:09

标签: java mocking 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 个答案:

答案 0 :(得分:9)

看起来你正在嘲笑你对生产代码的唯一电话。

换句话说,您的测试说:

  • 当我致电saveData()时,假冒结果返回true
  • 现在拨打saveData() - yay,结果是真的!

就我所见,你的生产代码都没有被调用。

模拟的目的是模拟生产类中的依赖项,或者(有时候,虽然我不愿意)模拟生产类的某些方法,而实际测试的代码会调用这些方法。

你应该可能嘲笑Leaderboard而不是Leaderboard本身的依赖关系。如果必须模拟saveData(),您应该测试调用 saveData()的方法...检查它们是否保存了正确的数据,当saveData()返回false等时,它们会正常运行

答案 1 :(得分:4)

如果我理解你的问题:

因为你在嘲笑LeaderBoard。这意味着你没有测试它。

如果你想测试LeaderBoard,你应该测试实际的类而不是模拟的类。

假设你想要测试A类但是这个类依赖于B和B在测试环境中实例化有点困难(出于任何原因)。在这种情况下,你可以模拟B.

但是你的情况是嘲笑A类本身。这意味着你没有测试任何东西。

答案 2 :(得分:0)

将运行器类添加为MockitoJUnitRunner,请参考以下示例代码

import org.mockito.junit.MockitoJUnitRunner

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

现在代码覆盖率将增加