如果没有在mock上调用方法,是否有一些方法不能被Mockito嘲笑?

时间:2014-01-22 20:06:25

标签: java unit-testing mockito

我是Mockito的新手,并认为它是嘲笑的摇滚乐。我刚刚遇到一个案例,似乎我无法让它工作 - 就是用模拟方法替换普通对象的方法, 没有 当我尝试模拟它时调用的方法。

这是我正在尝试做的一个超级简化示例,遗憾的是,它不会复制错误,但似乎与我的真实代码完全相同。

public class SimpleTest
{
    public class A
    {
    }

    public class B
    {
      public int getResult(A anObj)
      {
           throw new RuntimeException("big problem");
      }
    }

    @Test
    public void testEz()
    {
      B b = new B();
      B spy = spy(b);

      // Here are both of my attempts at mocking the "getResult" method. Both
      // fail, and throw the exception automatically.

      // Attempt 1: Fails with exception
      //when(spy.getResult((A)anyObject())).thenReturn(10);

      // Attempt 2: In my real code, fails with exception from getResult method
      // when doReturn is called. In this simplified example code, it doesn't ;-(
      doReturn(10).when(spy).getResult(null);
      int r = spy.getResult(null);
      assert(r == 10);
    }
}

所以目前当我运行测试时,当我尝试嘲笑间谍的“getResult”方法时,测试失败了。异常是我自己的代码(即运行时异常)的异常,它发生在我尝试模拟“getResult”方法=即执行上面的“doReturn”行时。

请注意,我的实际用例当然更复杂......“B”类有许多其他方法我想保留原样,只是模拟一种方法。

所以我的问题是如何模拟它以便不调用该方法?

主要注意:我刚从头开始重写整个测试,现在工作正常。我确定我的某个地方有一个错误,但它现在不存在 - 当使用间谍嘲笑时,该方法不被调用!为了它的价值,我在模拟方法时使用了doReturn语法。

doReturn(10).when(spy).getResult(null);

1 个答案:

答案 0 :(得分:1)

您的reedited问题现在运作得很好。

此注释行错误

when(spy.getResult((A)anyObject())).thenReturn(10);

应该是

when(spy.getResult(any(A.class))).thenReturn(10);

完整测试(未调用方法)

public class SimpleTest {

    public class A {
    }

    public class B {
        public int getResult(A anObj) {
            throw new RuntimeException("big problem");
        }
    }

    @Test
    public void testEz() throws Exception {

        B b = new B();
        B spy = spy(b);

        doReturn(10).when(spy).getResult(null);

        int r = spy.getResult(null);

        assert (r == 10);

    }

}

结果

Tests Passed: 1 passed in 0,176 s