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

Java Mockito通过了,但代码覆盖率仍然很低,java,mocking,mockito,Java,Mocking,Mockito,我使用mockito来模拟一个类,但是当我使用代码覆盖率时,它不会检测到方法是否被调用。我做错什么了吗?请帮忙 看起来您正在模拟对生产代码的唯一调用 换句话说,你的测试表明: 当我调用saveData()时,伪造结果以返回true 现在调用saveData()-yay,结果是真的 据我所知,您的生产代码根本没有被调用 模拟的目的是模拟生产类中的依赖项,或者(有时,尽管我不喜欢)模拟实际测试的代码将调用的生产类的某些方法 您可能应该模拟出排行榜的依赖关系,而不是排行榜本身。如果必须模拟save

我使用mockito来模拟一个类,但是当我使用代码覆盖率时,它不会检测到方法是否被调用。我做错什么了吗?请帮忙

看起来您正在模拟对生产代码的唯一调用

换句话说,你的测试表明:

  • 当我调用
    saveData()
    时,伪造结果以返回true
  • 现在调用
    saveData()
    -yay,结果是真的
据我所知,您的生产代码根本没有被调用

模拟的目的是模拟生产类中的依赖项,或者(有时,尽管我不喜欢)模拟实际测试的代码将调用的生产类的某些方法


您可能应该模拟出
排行榜
的依赖关系,而不是
排行榜
本身。如果必须模拟
saveData()
,则应该测试调用
saveData()
的方法。。。检查它们是否保存了正确的数据,当
saveData()返回false时,它们是否正确操作等。

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

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

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

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


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

将runner类添加为MockitoJUnitRunner,请参考下面的示例代码

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);
 }

}

现在代码覆盖率将增加

我不理解这个问题。是否引发异常?“代码覆盖率仍然很低”是什么意思?您是否使用外部工具进行验证?是哪一个?Cobertura?我用了EclEmma。通常,当我模拟东西并使用像NCover这样的工具时,它会显示正在调用的方法,我想知道我是否做错了什么,仅此而已。你是正确的,但我对NUnit和rhinomock做了同样的事情,NCover将其检测为调用。我想知道我是否应该使用接口叹息。似乎我要做一个集成测试,我试图避免在测试中点击DB,但模拟保存到DB,但看起来我必须获得代码覆盖率。谢谢大家的帮助:)@ferronrsmith:你似乎错过了我文章的重点:你的测试毫无意义。它没有测试你的任何代码。你期望它做什么?您不应该编写测试来获得代码覆盖率;您应该编写它们来练习代码。你介绍的测试并不能做到这一点。无论如何都要模拟保存部分,然后调用其他一些代码,这些代码依次调用
saveData()
。直接调用
saveData()
是没有意义的。(我很好奇当这是Java代码时你是如何使用NUnit和RhinoMocks的,顺便说一句……你显然没有测试相同的代码。)请给@Jon的答案打勾,因为他帮助你找到了解决方案。记住,模仿的目的是让你的类在测试中有一些虚假的合作者。通过直接测试你的模拟,你什么也得不到。这解决了我的问题。
import org.mockito.junit.MockitoJUnitRunner

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