为什么Mock对象已经过去了,然后又回来了?

时间:2016-12-29 10:57:41

标签: junit mockito powermock powermockito

注意:我理解在间谍中我们可以区分这两者。 我在互联网上走了一段路,但我仍然对Doreturn /何时以及何时返回Mockito感到怀疑.Below是我的疑问,

1)doreturn / when和when / thenreturn对模拟对象的作用相同吗? 也就是说,无论你是否为doreturn / when或when / thenreturn调用一个模拟对象,它都不会调用真正的方法,而是调用存根调用。 我的理解是对的吗?

2)doreturn / when和when / thenreturn仅对Mockito中的间谍对象产生影响。 即doreturn / when - 不会调用真正的方法,而且/ thenreturn会调用真正的方法。我的理解是正确的吗?

如果我对上述2点的理解是正确的,那么我们应该总是使用doreturn / when,这样我们就不需要学习2种语法,对吗?

2 个答案:

答案 0 :(得分:3)

doReturn()州的Mockito documentation

  

对于任何方法,您可以使用doThrow(),doAnswer(),doNothing(),doReturn()和doCallRealMethod()来代替使​​用when()的相应调用。

时有必要      
      
  • stub void methods
  •   
  • 间谍对象的存根方法(见下文)
  •   
  • 多次使用相同的方法,在测试过程中更改模拟的行为。
  •   

还有...

  

在无法使用when(Object)的情况下使用doReturn()。

给出一个例子......

  

when(mock.foo())。thenThrow(new RuntimeException());

     

//不可能:调用异常存根的foo()方法,因此抛出RuntimeException。       当(mock.foo())thenReturn( “条”);

     

//你必须使用doReturn()进行存根:
     doReturn( “条”)时(模拟)包含.foo();

通常,您应该使用when(...).thenReturn(...)语法,并且doReturn(...).when(...)语法有用的情况很少见。但是,重要的是要注意模拟void方法需要when(...)模式,这种模式并不罕见。这只是doReturn(...)语法,不太常用。

专门回答您的问题:

  1. 不,这两种语法的工作方式略有不同 - 'doReturn(...)'能够设置模拟对象,以便在调用模拟方法之前记录行为,而'when(...)'语法通过做一些幕后的jiggery-pokery来设置一个'thenReturn(...)'方法可以处理的存根处理程序。他们通常具有相同的效果,但实际差异在上面的角落情况中变得明显。

  2. 对于模拟,when(...)调用模拟对象上的存根方法。这就是为什么围绕重新定义存根行为的重要案例很重要。

答案 1 :(得分:2)

经过我自己的行动,我开始知道:

  1. doreturn / when和when / thenreturn对于模拟对象是相同的。他们都没有称实际方法
  2. doreturn / when和when / thenreturn对间谍对象有不同的行为。 doreturn / when - 它不会在间谍对象上调用真正的方法 when / thenreturn - 它将在间谍对象上调用实际方法
  3. 希望它有所帮助!