【问题标题】:Mockito Passes but Code Coverage still lowMockito 通过但代码覆盖率仍然很低
【发布时间】:2010-09-11 06:15:08
【问题描述】:
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 来模拟一个类,但是当我使用代码覆盖率时,它不会检测到该方法已被调用。难道我做错了什么?请帮忙!

【问题讨论】:

  • 我不明白这个问题。是否抛出异常? “代码覆盖率仍然很低”是什么意思 - 您是否使用外部工具进行验证?哪一个? Cobertura?
  • 我用过 EclEmma。通常,当我模拟东西并使用像 NCover 这样的工具时,它会显示正在调用的方法,我想知道我是否做错了什么。

标签: java mocking mockito


【解决方案1】:

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

换句话说,你的测试说:

  • 当我调用saveData() 时,伪造结果返回true
  • 现在打电话给saveData() - 是的,结果是真的!

据我所知,您的生产代码根本没有被调用。

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

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

【讨论】:

  • 你是对的,但我对 NUnit 和 RhinoMocks 做了同样的事情,并且 NCover 将其检测为调用。我想知道我是否应该使用界面叹息。
  • 似乎我将不得不做一个集成测试,我试图避免命中数据库进行测试,但模拟将其保存到数据库,但它看起来像我有代码覆盖率到。感谢大家的帮助:)
  • @ferronrsmith:您似乎错过了我的帖子的主旨:您的测试毫无意义。它不是在测试您的 任何 代码。你期望它做什么?您不应该编写测试来获得代码覆盖率;您应该编写它们来练习您的代码。您提供的测试没有这样做。无论如何都要模拟出保存部分,然后调用一些其他代码,这些代码又调用saveData()。简单地直接调用saveData() 是没有意义的。 (当这是 Java 代码时,我很想知道您是如何使用 NUnit 和 RhinoMocks 的,顺便说一句……您显然没有测试相同的代码。)
  • 请给@Jon 的答案打勾,因为他帮助您找到了解决方案。请记住,嘲弄的目的是给你的被测类一些虚假的合作者。直接测试你的模拟,你什么也得不到。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    现在代码覆盖率会增加

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 2016-03-21
      • 2016-03-17
      • 2018-10-21
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多