java - Mockito 验证类对象 NotAMockException

标签 java class testing mockito verify

我正在尝试为以下静态方法编写测试:

public static Field getField (Class<?> type, String fieldName) {
    for (Field field : type.getDeclaredFields()) {
        if (field.getName().equals(fieldName)) {
            return field;
        }
    }

    if (type.getSuperclass() != null) {
        return getField(type.getSuperclass(), fieldName);
    }

    return null;
}

这是我的测试代码:

@Test
public void getFieldTest () {
    class StupidObject { Object stupidField; }
    class ReallyStupidObject extends StupidObject { Object reallyStupidField; }
    ReallyStupidObject reallyStupidObject = mock(ReallyStupidObject.class);
    // --------------------------------------------------
    Field field = FSUtils.getField(reallyStupidObject.getClass(), "stupidField");
    // --------------------------------------------------
    verify(reallyStupidObject.getClass()).getDeclaredFields();
    verify(reallyStupidObject.getClass()).getSuperclass();
    verify(reallyStupidObject.getClass().getSuperclass()).getDeclaredFields();
    verify(reallyStupidObject.getClass().getSuperclass(), never()).getSuperclass();
    assertEquals(field.getName(), "stupidField");
}

导致此错误的原因:

org.mockito.exceptions.misusing.NotAMockException: Argument passed to verify() is of type Class and is not a mock!

谁能阐明我如何验证对 Class 对象调用的方法?

非常感谢!

本。

最佳答案

这似乎不是一个应该用模拟来解决的问题。我会选择这样的具体测试:

@Test
public void getFieldTest() {
    class StupidObject { Object stupidField; }
    class ReallyStupidObject extends StupidObject { Object reallyStupidField; }

    // test the right field is found in the right class
    testFieldFind("stupidField", ReallyStupidObject.class,
            StupidObject.class);
    testFieldFind("reallyStupidField", ReallyStupidObject.class,
            ReallyStupidObject.class);

    // check that non-existent fields return null
    assertNull(FSUtils.getField(ReallyStupidObject.class, "fooballs"));
}

private static void testFieldFind(String fieldName, Class<?> classToSearch,
        Class<?> expectedDeclaringClass) {
    Field field = FSUtils.getField(classToSearch, fieldName);
    assertEquals(fieldName, field.getName());
    assertEquals(expectedDeclaringClass, field.getDeclaringClass());
}

至于为什么您的原始代码失败 - 您必须在模拟对象上调用 verify,即 verify(reallyStupidObject).doSomething()

关于java - Mockito 验证类对象 NotAMockException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675741/

相关文章:

Java进程在Linux上被卡住(?)

c# - 如何覆盖从构造函数调用的基类方法

python - 是否可以抓取未分配给变量的实例化对象?

java - 泽西客户端测试

testing - 期望一个元素有一个滚动

ruby-on-rails - 应该 helper 不工作

java - 尽管出现错误,如何继续循环中的测试

java - 覆盖 jar 内的 .tld 文件

c# - 如何将参数传递给静态类构造函数?

java - this == null in java ,之后还执行为什么继续?