Java 是否有一些方法可以';如果mock上没有调用该方法,Mockito不会对其进行模拟吗?

Java 是否有一些方法可以';如果mock上没有调用该方法,Mockito不会对其进行模拟吗?,java,unit-testing,mockito,Java,Unit Testing,Mockito,我对Mockito是个新手,我觉得它很适合嘲笑。我刚刚遇到一种情况,我似乎无法让它工作——用模拟方法替换普通对象的方法,,而当我试图模拟它时,没有调用该方法 下面是一个超级简化的示例,说明了我正在尝试做的事情,遗憾的是,它没有复制错误,但似乎与我的真实代码完全相同 public class SimpleTest { public class A { } public class B { public int getResult(A anObj

我对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);
    }
}
因此,当前当我运行测试时,当我尝试并模拟spy的“getResult”方法时,由于抛出异常,测试失败。该异常是来自我自己代码的异常(即运行时异常),当我在执行上面的“doReturn”行时尝试并模拟“getResult”方法=ie时,就会发生该异常

请注意,我的实际用例当然更复杂。。。“B”类还有很多其他的方法,我想让它们保持原样,只是模仿一个方法

那么我的问题是如何模拟它,从而不调用该方法?

主要提示:我刚刚从头重写了整个测试,现在一切正常。我确信我在他们的某处有一个bug,但现在它不在那里了——当使用间谍模拟方法时,不会调用该方法!值得一提的是,我在模拟这个方法时使用了doReturn语法

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

您重新编辑的问题现在效果很好。

这一行是错误的

when(spy.getResult((A)anyObject())).thenReturn(10);
应该是

when(spy.getResult(any(A.class))).thenReturn(10);
完全测试(未调用方法) 结果
嘿这个测试要复杂得多,而且有很多领域特定的东西。。。但失败的核心是那两行“when…”和“doReturn…”行。。。但根据您的经验,是否有任何方法无法监视,因为当您试图模拟该方法时,该方法正在引发异常?当出现时,带有
的行肯定会引发异常。但是带有
doReturn
的行应该可以正常工作。这是正确的做事方式。你确定这个方法不是
final
之类的吗?另外,这是
getResult
的唯一实现吗?@BradParks不,也许您应该添加在不起作用时获得的stacktrace。我还要确保测试中使用了间谍(
b
,而不是
a
),谢谢您的反馈。我将我的伪代码更新为真实代码,它可以工作。我的mock方法不是final,但它有一个@Context arg。这是签名:public Response getResult(@Context-HttpServletRequest)。请注意,我在模拟和调用该方法时传递null。伪代码可以正常工作,添加真实代码:)请停止编辑此文章,因为我的答案是第一个版本:)彻底的更改需要新的问题。
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