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

Mockito mocked对象从方法内部的方法调用中分配一个空值

司徒池暝
2023-03-14

我需要用mockito测试一个类。下面是课堂和Mockito测试。

dbBuilder。parse(file)总是返回null,因为它调用几个类,这些类反过来又调用jar文件中的几个方法。尽管我嘲笑了所有这些,但它总是返回null。我无法跟踪空值来自何处。我试图压制这些方法,但仍然没有用。

由于此方法调用返回null,因此doc值为null。因此文档调用getElementsByTagName方法并运行mockito测试失败,NullPointerException。这个方法中这段代码后面有几行代码我需要测试。

如何解决此问题?

class DocumentClass{
    public void docMethod(){
        DocumentBuilder dbBuilder = new DocumentBuilder();
        Document doc = new Document();
        FileStream file = new FileStream(new File(some path));
        doc = dbBuilder.parse(file);
        NodeList nodes = doc.getElementsByTagName("documents");
    }
}

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Document.class,DocumentBuilder.class,FileStream.class})
public class TestDocument{
    @Test
    public documentTest(){
        DocumentBuilder dbBuilder = PowerMockito.mock(DocumentBuilder.class);
        Document doc = PowerMockito.mock(Document.class);
        FileStream file = PowerMockito.mock(FileStream.class);
        PowerMockito.whenNew(FileStream.class).withAnyArguments().thenReturn(file);
        PowerMockito.doReturn(doc).when(dbBuilder).parse(file);
        DocumentClass docClass = PowerMockito.mock(DocumentClass.class);
        docClass.docMethod();
   }
}

共有2个答案

袁羽
2023-03-14

您没有使用PowerMockito.whenNew(DocumentBuilder.class),因此使用的构建器是真正的构建器,而不是模拟。

云煌
2023-03-14

编辑:我知道你提到过你以前尝试过whenNew,但我提供了更详细的答案,以检查这项工作所需的所有细节。

在我看来,您需要模拟DocumentBuilder类的构造函数调用。当您这样做时,您需要将调用构造函数的类包含在准备测试注释中,因此请确保那里存在DocumentClass。请参阅留档(主要是快速摘要),了解在模拟构造函数调用时为测试准备的内容。

然后,您还需要为DocumentBuilder上的方法调用提供期望调用。

此外,我认为您不需要调用Document类的构造函数,在您简单地将引用替换为来自dbBuilder的引用之前,您无需对其执行任何操作。

所以我认为你的方法可以如下所示:

class DocumentClass{
    public void docMethod(){
        final FileStream file = new FileStream(new File(some path));

        final DocumentBuilder dbBuilder = new DocumentBuilder();
        final Document doc = dbBuilder.parse(file);

        final NodeList nodes = doc.getElementsByTagName("documents");
    }
}

所以我认为你的测试应该是这样的:(我没有尝试过这个代码,所以我为任何拼写错误道歉)

@RunWith(PowerMockRunner.class)
@PrepareForTest({DocumentClass.class, Document.class, DocumentBuilder.class, FileStream.class})
public class TestDocument {
    @Test
    public documentTest() {
        final DocumentBuilder dbBuilder = PowerMockito.mock(DocumentBuilder.class);
        final Document doc = PowerMockito.mock(Document.class);
        final FileStream file = PowerMockito.mock(FileStream.class);
        final NodeList nodes = PowerMockito.mock(NodeList.class);

        PowerMockito.whenNew(FileStream.class).withAnyArguments().thenReturn(file);
        PowerMockito.whenNew(DocumentBuilder).thenReturn(dbBuilder);
        PowerMockito.doReturn(doc).when(dbBuilder).parse(file);
        PowerMockito.doReturn(node).when(doc).getElementsByTagName("documents");

        PowerMock.replayAll();

        DocumentClass docClass = new DocumentClass();
        docClass.docMethod();

        PowerMock.verifyAll();
    }
}
 类似资料:
  • 本文向大家介绍是否可以从一个static方法内部发出对非static方法的调用?相关面试题,主要包含被问及是否可以从一个static方法内部发出对非static方法的调用?时的应答技巧和注意事项,需要的朋友参考一下 不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个stati

  • 问题内容: 我有一个非常简单的Java类,它使用输入验证以及明显的void set()和String get()方法来有效地装饰Map。 我希望能够有效地调用这些方法并从JVM外部处理返回值和异常,但仍在同一台计算机上 更新:我想到的调用者不是另一个JVM; 谢谢@戴夫雷 我的实施注意事项很典型 性能 易于实施和维护(简单吗?) 可靠性 灵活性(例如,我可以从远程计算机上拨打电话等) 有“正确的方

  • 问题内容: 我有 但后来当我打电话从通过运行以下命令在命令行上,JAVA抱怨说,你不能调用从静态功能的方法。 所以我的问题是:如何从主方法调用方法,如果不可能,使用java命令从命令行运行程序后,有哪些替代策略可以调用方法。 问题答案: 您只能针对类的实例调用类似的实例方法(顺便说一下,这是一个非法的方法名称): 另外,如果对您的设计有效,则也使它成为静态。

  • 我有一个层,称为,另一个称为。我想知道我是否可以强制执行一条规则,上面写着: 在参数列表包含名为foo的参数的服务层中的任何公共类的任何公共方法中,断言它从权限层调用方法(理想情况下,确保在服务层中的任何其他方法之前调用该方法)。 ArchUnit可以这样做吗?

  • 问题内容: 尝试在Parent类中创建1个接口和2个具体类。这将使封闭类成为内部类。 现在,我真的不确定如何在静态main()方法中创建C类的对象并调用C类的call()方法。现在我遇到了问题: 问题答案: 这里的内部类不是静态的,因此您需要创建一个外部类的实例,然后调用new, 但是在这种情况下,您可以将内部类设为静态, 那就可以使用了

  • 问题内容: 我是python的新手。我试图在类中将值从一种方法传递给另一种方法。我搜索了该问题,但无法获得适当的解决方案。因为在我的代码中,“ if”正在调用类的方法“ on_any_event”,而该方法反过来应该调用我的另一个方法“ dropbox_fn”,该方法利用了“ on_any_event”中的值。如果“dropbox_fn”方法在类之外,它将起作用吗? 我将用代码说明。 这里的主要问