【问题标题】:How to get original class name from a mocking object?如何从模拟对象中获取原始类名?
【发布时间】:2017-09-13 07:20:09
【问题描述】:
Book aBook = mock(Book.class);

当我写执行时

aBook.getClass() 它给了

classcom.tw.model.Book$$EnhancerByMockitoWithCGLIB$$feb29207

但我想要:classcom.tw.model.Book

【问题讨论】:

  • aBook.getClass().getSuperclass()(或 .getInterfaces() 中的类之一,如果模拟类是接口)。
  • 但是为什么你真的需要知道这些信息呢?总的来说,如果您需要知道实例的实际类,您的设计就有问题。
  • doAnswer(...).when(...)?
  • @Pelocho : getClass 是最终结果。可能很棘手。
  • 你能用 instanceof 代替 getClass 吗?

标签: java mockito


【解决方案1】:

从 Mockito 2.1.0 开始,您可以使用 getMockCreationSettings() 获取有关 什么 被模拟的详细信息。来自docs

增加了通过

访问模拟创建设置的可能性

Mockito.mockingDetails(mock).getMockCreationSettings()

这是一个例子:

@Test
public void aTest() {
    Foo mock = Mockito.mock(Foo.class);

    MockCreationSettings<?> mockCreationSettings = Mockito.mockingDetails(mock).getMockCreationSettings();

    Assert.assertEquals(Foo.class, mockCreationSettings.getTypeToMock());
}

【讨论】:

  • 从我认为 OP 在被测方法中调用 getClass 的 cmets 中。这种方法不能满足 OPs 问题。
  • OP 没有明确 在哪里他想打电话给aBook.getClass() 所以我认为目前还不清楚(至少对我来说 :) 究竟在哪里/他何时/如何获得他的模拟的原始类型,如果他想在测试用例内获得它,那么这个答案将起作用,但如果他需要在被测系统内获得它那么它不会。
  • 是的,你是对的,我已经为另一种情况添加了答案;)
【解决方案2】:

使用instanceof 而不是getClass()

void methodUnderTest(Object object) {
    if (object instanceof Book) {
        Book book = (Book) object;
        // read the book
    }
}

现在可以使用模拟轻松测试:

@Test
public void bookTest() {
    methodUnderTest(mock(Book.class));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 2011-04-08
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多