我需要用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();
}
}
您没有使用PowerMockito.whenNew(DocumentBuilder.class)
,因此使用的构建器是真正的构建器,而不是模拟。
编辑:我知道你提到过你以前尝试过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”方法在类之外,它将起作用吗? 我将用代码说明。 这里的主要问