如何在mockito中设置对mock对象方法的调用而不调用原始方法本身

时间:2012-03-09 17:11:36

标签: java mocking mockito

mockito-version:1.9.0

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

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

e.g。

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?

1 个答案:

答案 0 :(得分:7)

以下操作在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不会模拟最终和静态方法。相反,它将调用委托给真正的实现。

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

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

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

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

在测试方法中使用PowerMock方法模拟类:

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

然后照常进行。