检查模拟对象的类类型

时间:2011-06-07 12:04:03

标签: mocking mockito instanceof

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

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

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

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

嗯,这个测试实际上失败了。有谁知道为什么?有人知道如何通过在测试中使用模拟来解决这个问题吗?是否有其他方法可以将对象与特定类进行比较。

非常感谢您的帮助。

最好的问候

了Gerardo

5 个答案:

答案 0 :(得分:8)

你的第一个断言永远是真的--Mockito模拟是一个全新的类,所以一个简单的equals()永远不会起作用。顺便说一句,对于这样的测试,如果你使用Assert.assertEquals(),你会得到一个更有用的失败消息,其中第一个参数是预期的结果; e.g:

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

你的第二个断言是正确的,但是你已经混淆了isAssignableFrom()的方向(很容易做到,JavaDoc非常令人困惑) - 翻转它并且你是金色的:

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

答案 1 :(得分:2)

我认为instanceof会以你想要的方式工作:

Assert.assertTrue(adapterEvent instanceof AdapterEvent);

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

答案 2 :(得分:2)

Mockito 2.0.0中有一个新方法getMockedType,它返回最初传递给Mockito.mock(Class)的类。我建议使用此方法,因为getSuperClass()技术并不适用于所有情况。

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

答案 3 :(得分:1)

要测试对象已返回您期望的类的实例,请执行以下操作

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

答案 4 :(得分:0)

Mocked类是从原始类中继承的,所以只需检查超类,如下所示:

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