当前位置: 首页 > 知识库问答 >
问题:

类对象NotAMockException上的Mockito验证

谭健柏
2023-03-14

我试图为以下静态方法编写一个测试

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");
}

多谢!

本。

共有1个答案

司毅庵
2023-03-14

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

@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()

 类似资料:
  • 我面临Mockito junit测试的问题。我是新手,对我面临的问题有点困惑。在此方面的任何帮助都将不胜感激。 获得异常: 在下面的代码中 我知道活动不是一种模拟,但我不确定是否有办法解决这个问题,因为 是同一类中的一种方法。我需要为编写规则,因为我已经完成了它的单元测试。的定义由外部依赖关系组成。我是否应该嘲笑中存在的外部依赖关系并为它们编写规则,而不是为规则? 我发现了这篇文章:Mockito

  • 如何验证一个模拟对象根本没有被调用?我正在尝试使用Mockito测试一个接口方法的空实现。

  • 我有下课情节。在测试MyTestableClass时,我希望处理Autowired类。我只想模拟AutoWired类中的变量。 示例类如下- 例如,Console在返回true之前应该给我“inside Service class”。 提前道谢!

  • 问题内容: 我已经有一段时间没有接触过Mockito了,我也从未广泛使用它。但是今天,在一些新代码中,我想使用最佳实践,因此我使用以下Java版本退出了模仿内核2.0.54-beta: 我需要此接口的实例进行测试: https://bitbucket.org/globalmentor/rincl/src/bf0e8875a1bae16247dd904e0b8bc067c9f8abc9/src/ma

  • 我有一段时间没有接触过Mockito,也从来没有大量使用过它。但是今天在一些新代码中,我希望使用最佳实践,所以我使用以下Java版本推出了mockito-core 2.0.54-beta: 要重现此问题,请克隆https://bitbucket.org/globalmentor/rincl.git并签出commit2f88d7c5e5ac17b6d316ed54c12cb7b447b7d6ac。然

  • 我在SearchString.contains(“”),我正在尝试调用“when(...).thenreturn(...)”但是mockito抛出了一个异常,说“不能mock/spy class java.lang.String”我不确定在测试这个web服务时我做得是否正确。也许有别的方法可以做到这一点?下面是我的测试类: