检查模拟对象的类类型



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

但在测试中,我必须使用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));

这个测试实际上失败了。有人知道为什么吗?有人知道我如何通过在测试中仍然使用模拟来解决这个问题吗?是否存在将对象与特定类进行比较的另一种方法。

您的第一个断言永远不会为真-Mockito mocks是一个全新的类,因此简单的equals()永远不会工作。顺便说一句,对于这样的测试,如果使用Assert.assertEquals(),您将得到一个更有用的失败消息,其中第一个参数是预期结果;例如:

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

您的第二个断言是正确的,但您混淆了isAssignableFrom()的方向(很容易做到,JavaDoc非常令人困惑)-将其翻转过来,您就是黄金:

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

我认为instanceof会按照您希望的方式工作:

Assert.assertTrue(adapterEvent instanceof AdapterEvent);

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

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

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

要测试一个对象是否返回了您期望的C#中的类实例,请执行以下

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

Mocked类是从原始类中派生出来的,所以只需检查超类,如下所示:

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

最新更新