嘲笑与嘲笑的嘲笑框架

在嘲笑框架中,你可以嘲笑一个对象或间谍。 这两者之间有什么区别,什么时候我应该使用一个呢? 例如,看看mockito,我发现使用间谍和嘲笑也有类似的情况,但我不确定两者之间的区别。

模拟对象完全replace模拟类,返回logging或默认值。 你可以从“稀薄的空气”中创build模拟。 这是unit testing中最常用的。

在进行间谍活动时,你需要一个现有的对象,并“只”replace一些方法。 当你有一个巨大的类,只想嘲笑某些方法(部分模拟)时,这是非常有用的。 让我引用Mockito文档 :

你可以创build真实对象的间谍。 当你使用间谍,那么真正的方法被调用(除非方法被扼杀)。

真正的间谍应该谨慎地偶尔使用 ,例如在处理遗留代码时。

如有疑问,请使用嘲笑。

可以尝试在这里用示例来解释。

// difference between mocking, stubbing and spying @Test public void differenceBetweenMockingSpyingAndStubbing(){ List list = new ArrayList(); list.add("abc"); assertEquals(1,list.size()); List mockedList = spy(list); when(mockedList.size()).thenReturn(10); assertEquals(10,mockedList.size()); } 

在这里,我们有最初的真实对象列表,其中我们添加了一个元素和预期大小为一个。

我们窥探真实对象的含义,我们可以指示哪种方法被扼杀。 所以我们声明我们将方法size()放在间谍对象上,不pipe实际大小是多less,都会返回10。

简而言之,您将窥探真实对象并存储一些方法。

Mockito警告说,部分嘲讽不是一个好的做法,你应该修改你的OO架构。 间谍(或部分嘲弄)build议testing遗留代码。

部分嘲弄可以通过使用间谍以及模拟来实现。 对于模拟,我们使用thenCallRealMethod来调用实际的方法,默认情况下间谍调用实际的方法。 所以两者都实现了部分模拟的相同目标。 不过build议使用Spy进行部分模拟。

当我们使用Mock时,实际的对象实例不会被创build,而是创buildClass的裸骨壳实例来跟踪交互。 而在间谍的情况下,我们自己创build间谍使用的对象实例。 所以使用Mockito间谍保证真正的方法被调用正确。

例如-

 public class EmployeePaymentService { EmployeePaymentService( final NamedParameterJdbcTemplate namedParameterJdbcTemplate) { this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; } public int getNoOfWorkingDays(String empId) { //call some query int days=namedParameterJdbcTemplate.query(); return days; } } 

如果对于一个unit testing用例,我们使用Mock as-模拟上面的EmployeePaymentService,

 @Mock private EmployeePaymentService employeePaymentService; 

然后使用thenCallRealMethod调用实际方法getNoOfWorkingDays,如下所示 –

 when(employeePaymentService.getNoOfWorkingDays(anyString())).thenCallRealMethod(); int returnedWrkingDays = employeePaymentService.getNoOfWorkingDays(empId); 

我们在getNoOfWorkingDays方法中得到一个java.lang.NullPointerException ,因为namedParameterJdbcTemplate从来没有被初始化。 但是,如果我们使用Mockito Spy,那么这种情况永远不会出现,因为我们将使用具有namedJdbcTemplate的构造函数创buildEmployeePaymentService。

有关更多详细信息,请查看此帖

间谍有两个定义。 一,是真正的方法被调用的地方,另一个地方没有function被调用,只有null或null的等价值被返回,但方法被调用,并且他们的状态被logging下来,通常就像方法x被称为y次。

参考: http : //javapointers.com/tutorial/difference-between-spy-and-mock-in-mockito/

当使用模拟对象时,不存根的方法的默认行为是什么都不做。 简单的意思是,如果它是一个void方法,那么当你调用该方法时,它将不会做任何事,或者如果它带有一个返回值的方法,那么它可能会返回null,空或默认值。

当然,在间谍对象当中,因为它是一个真正的方法,所以当你不扼杀这个方法时,它会调用真正的方法行为。 如果你想改变和嘲笑的方法,那么你需要存根。