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

for*_*ste 8 java mocking mockito

mockito-version:1.9.0

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

编辑:这个例子实际上按预期工作,即身体方法"test()"没有被执行.但是,在进一步调查之后,我注意到原始方法有默认的可见性修饰符,我怀疑这会导致问题,因为在将其更改为公共之后(不应该是相同的吗?!)它按预期工作.

例如

public class TestClass {
  public String test() {
    System.out.println("test called!");
    return "test";
  }
}
Run Code Online (Sandbox Code Playgroud)
//in test
TestClass mock = mock(TestClass.class);

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

Tom*_*sky 8

下面,1.9.0的Mockito和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!");
  }
}
Run Code Online (Sandbox Code Playgroud)

此外,如果我在test()方法中放置一个断点,它永远不会被击中.

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

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

编辑:新想法:你嘲笑最后的方法吗?

如果final向正在模拟的方法添加修改器,则会获得您报告的行为.

这是因为Mockito不会模拟最终和静态方法.相反,它将调用委托给真正的实现.

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

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

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

@RunWith(PowerMockRunner.class)
@PrepareForTest(TestClass.class)
public class TestNonCall {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

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

final TestClass mock = PowerMockito.mock(TestClass.class);
Run Code Online (Sandbox Code Playgroud)

然后照常进行.