【问题标题】:how to setup a call to method of mocked object in mockito without calling the original method itself如何在 mockito 中设置对模拟对象方法的调用而不调用原始方法本身
【发布时间】:2012-03-09 17:11:35
【问题描述】:

模拟版本:1.9.0

我想在 mockito 中设置对模拟对象的方法的调用,而不调用原始方法本身:

编辑:此示例实际上按预期工作,即未执行主体方法“test()”。但是,经过进一步调查,我注意到原始方法具有默认的可见性修饰符,我怀疑这会导致问题,因为在将其更改为 public 之后(这不应该相同吗?!)它按预期工作。

例如

public class TestClass {
  public String test() {
    System.out.println("test called!");
    return "test";
  }
}

//in test
TestClass mock = mock(TestClass.class);

when(mock.test()).thenReturn("mock!"); //<-- prints test called here? why? how can I switch it off?

【问题讨论】:

  • when(mock.test) 不会编译,这让我怀疑其余的。请仔细检查这是否真的是您的代码所说的。
  • 此外,Mockito 不会模拟最终类或方法,因为它是由 JVM 本身强制执行的。
  • 这只是一个例子,真正的代码会使事情变得不必要的复杂
  • 您使用的是什么版本的 mockito?我熟悉您所描述的问题,并且我知道它曾经是默认行为。也许它在最近的版本中发生了变化。
  • 我使用的是 1.9.0 版本

标签: java mocking mockito


【解决方案1】:

以下在 Mockito 1.9.0 和 JUnit 4.8.2 下运行,向我的控制台打印任何内容:

import static org.mockito.Mockito.*;

import org.junit.Test;

public class TestNonCall {
  public class TestClass {
    public String test() {
      System.out.println("test called!");
      return "test";
    }
  }

  @Test
  public void doTest() {
    final TestClass mock = mock(TestClass.class);

    when(mock.test()).thenReturn("mock!");
  }
}

此外,如果我在 test() 方法中设置断点,它永远不会被命中。

也许发布更多代码?看起来您的示例不够复杂,无法展示您遇到问题的行为。

另外:您使用的是最新版本的 Mockito 吗?

编辑:新思想:你在嘲笑最终方法吗?

如果您将 final 修饰符添加到您正在模拟的方法中,您将获得您报告的行为。

这是因为 Mockito 不模拟 final 和 static 方法。相反,它将调用委托给真正的实现。

您的实际代码可能会尝试模拟最终方法吗?

如果是这样,您可以使用 PowerMock,它是 Mockito 的扩展,允许模拟最终方法。

您需要在测试用例类中添加以下注释:

@RunWith(PowerMockRunner.class)
@PrepareForTest(TestClass.class)
public class TestNonCall {
  // ...
}

并在您的测试方法中使用 PowerMock 方法模拟该类:

final TestClass mock = PowerMockito.mock(TestClass.class);

然后照常进行。

【讨论】:

  • 更新了帖子。在尝试了上面发布的示例之后 - 之前应该真的这样做过! - 我得到了和你一样的结果。我将模拟方法的修饰符从默认更改为公共(实际上应该是相同的!?),它现在可以工作了。
  • 哇,我也遇到了同样的问题,但忽略了那个小修饰符……你救了我的命!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 2016-06-08
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多