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来模拟一个类,但是当我使用代码覆盖时,它没有检测到该方法被调用。难道我做错了什么?请帮忙!
答案 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;
}
现在代码覆盖率将增加