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自己的依赖关系。如果你必须mock out saveData(),你应该测试调用 saveData()的方法......检查它们是否保存了正确的数据,它们在saveData()返回 false 时是否正确运行,等等。

于 2010-09-11T06:24:32.507 回答
7

如果我正确理解您的问题:

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

如果你想测试排行榜,你应该测试实际类而不是模拟类。

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

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

于 2010-09-11T06:24:50.567 回答
1

添加 runner 类为 MockitoJUnitRunner,请参考以下示例代码

import org.mockito.junit.MockitoJUnitRunner

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

现在代码覆盖率会增加

于 2019-01-05T19:13:28.033 回答