检查模拟对象的类类型

检查模拟对象的类类型

问题描述:

当前我正在测试一个获取对象并检查该对象是否存储为实例变量的类实例的方法。到目前为止没有问题。检查模拟对象的类类型

但在测试中我必须使用mock,其中一个mock是传递给该方法的对象。现在,它变得棘手。让我们来看看代码(我总结了本次测试的代码):

Class<AdapterEvent> clazz = AdapterEvent.class; 
    AdapterEvent adapterEvent = Mockito.mock(AdapterEvent.class); 

    Assert.assertTrue(adapterEvent.getClass().equals(clazz)); 
    Assert.assertTrue(adapterEvent.getClass().isAssignableFrom(clazz)); 

那么,这个测试实际上失败。有谁知道为什么?有人有一个想法,我怎样才能解决这个问题,仍然在测试中使用模拟?是否有另一种比较对象与特定类的方法。

非常感谢您的帮助。

问候

赫拉尔

+0

您可能需要接受下面的答案之一(如果是正确的)。 – walters 2012-09-19 07:55:25

我认为的instanceof会工作,你希望它的方式:

Assert.assertTrue(adapterEvent instanceof AdapterEvent); 

你确定你应该甚至可以测试这个?不知道你想要完成什么,这很难说,但我认为这个测试可能没有必要。

你的第一个断言是从来没有是真的 - Mockito嘲笑是一个全新的类,所以一个简单的equals()将永远不会工作。顺便说一下,对于像这样的测试,如果您使用Assert.assertEquals(),则第一个参数是预期结果;如果您使用Assert.assertEquals(),则会获得更有用的失败消息;例如:

Assert.assertEquals(clazz, adapterEvent.getClass()); 

你的第二个断言是正确的,但你已经混在一起的isAssignableFrom()方向(很容易做到,JavaDoc中是强大的混乱) - 翻转过来,它和你的黄金:

Assert.assertTrue(clazz.isAssignableFrom(adapterEvent.getClass())); 

嘲笑类是从原始类的子类,所以只是检查超,就像这样:

Assert.assertTrue(。adapterEvent.getClass()getSuperclass之()等于(clazz所));

+0

更好的是使用'Assert.assertEquals(clazz,adapterEvent.getClass()。getSuperclass());'。那么当测试失败时,你会得到一个更有用的错误信息。 – 2016-06-01 13:23:02

Mockito 2.0.0中有一种新方法getMockedType,它返回最初传入Mockito.mock(Class)的类。我建议使用这种方法,因为getSuperClass()技术在所有情况下都不起作用。

MockingDetails mockingDetails = Mockito.mockingDetails(mockObj); 
Class<?> cls = mockingDetails.getMockedType(); 

要测试的对象返回你期望那么类的实例做以下

Assert.IsInstanceOfType(adapterEvent, typeof(AdapterEvent)); 
+2

虽然这个答案也许可以解决问题,但总是添加解释。 – 2017-11-24 06:44:49