Java 使用Mockito调用模拟方法时发生NullPointerException
我在模拟一个被模拟的方法时得到了Java 使用Mockito调用模拟方法时发生NullPointerException,java,junit,mockito,powermock,Java,Junit,Mockito,Powermock,我在模拟一个被模拟的方法时得到了NPE。我的理解是,只要我们使用mock对象调用方法,mock就会处理所有其他事情 测试中的方法 public IDocumentSet sendDocuments(IClientUserDto cu, IDocumentSet ds) throws ESignatureProviderException { logMethodStartDebug(cu, CLASS_NAME, "sendDocuments(IClientUserDto, IDocu
NPE
。我的理解是,只要我们使用mock对象调用方法,mock就会处理所有其他事情
测试中的方法
public IDocumentSet sendDocuments(IClientUserDto cu, IDocumentSet ds) throws ESignatureProviderException {
logMethodStartDebug(cu, CLASS_NAME, "sendDocuments(IClientUserDto, IDocumentSet)");
IDocumentSet set = null;
List<DocumentContent> documentContent = new ArrayList<DocumentContent>();
Envelope env = new Envelope();
MultiPart multiPart = new MultiPart();
String token = null;
String envId = null;
String status = null;
try {
List<IDocumentDto> dtos = loadDocuments(cu, ds);
List<IDocument> docs = ds.getDocuments();
dtos = validateDocs(docs, dtos);
ISendDocumentsTransformerArgs args = new SendDocumentsTransformerArgs(cu);
args.setDocuments(docs);
args.setDocumentDtos(dtos);
args.setCallbackConfiguration(getConfiguration().getCallback());
args.setModuleConfiguration(getModuleConfiguration());
ITransformer transformer = new SendDocumentsRESTTransformer();
ITransformerResult result = transformer.transformRequest(args);
因此,当代码到达
transformer.transformRequest(args)时代码>行,它爆炸了。我在模拟ITransformer并对其调用transformerRequest方法,这不应该返回一个模拟对象,或者我用了一种错误的方法 您不是在模拟transformer对象
ITransformer transformer = new SendDocumentsRESTTransformer();
此行正在创建实际对象,而不是模拟对象。调用新的SendDocumentsRESTTransformer()时,需要指示mockito注入一个模拟对象。使用PowerMockito来执行此操作
PowerMockito.whenNew(SendDocumentsRESTTransformer.class.),不带arguments(),然后返回(iTransformer)
在调用之前,在测试方法中添加此行
docusignRestProvider.sendDocuments( iClientUserDto, iDocumentSet );
这将指示Mockito在调用new SendDocumentsRESTTransformer()
时返回模拟对象,因此在sendDocuments
方法中,transformer被设置为模拟对象 您不是在模拟transformer对象
ITransformer transformer = new SendDocumentsRESTTransformer();
此行正在创建实际对象,而不是模拟对象。调用新的SendDocumentsRESTTransformer()时,需要指示mockito注入一个模拟对象。使用PowerMockito来执行此操作
PowerMockito.whenNew(SendDocumentsRESTTransformer.class.),不带arguments(),然后返回(iTransformer)
在调用之前,在测试方法中添加此行
docusignRestProvider.sendDocuments( iClientUserDto, iDocumentSet );
这将指示Mockito在调用new SendDocumentsRESTTransformer()
时返回模拟对象,因此在sendDocuments
方法中,transformer被设置为模拟对象 这里给你一个完全没有答案的答案:我认为你走错了兔子洞
任何需要如此多测试设置的类,正如您在这里所展示的,都显然违反了规则
单元测试只能在用于小的、可测试的生产代码单元时展现其优点。但是,为了设置测试用例,您需要10+个模拟,并在4个类中模拟静态方法
这是我个人的观点,但基于很多经验:这样的测试对你没有帮助。您需要花费小时编写测试代码,只需遵循生产代码的实现。这样你就找不到虫子了
只有在必须更改生产代码时,您才会发现单元测试中断。更糟糕的是:即使是最简单的重构也可能立即破坏这样的单元测试。当模拟静态内容时,即使是另一个类中与之无关的更改也有可能在其他地方变成失败的单元测试
这种单元测试对您的工作没有帮助;相反,它们会让你慢下来
换句话说:您不应该花时间去理解为什么PowerMock在这里让您失败(因为您在测试用例中做了一些错误的事情)。相反,你应该做两件事中的一件:
- 如果可能,请重新设计生产代码。面向对象设计;开始修复迄今为止造成的混乱!学习如何编写代码
- 如果这是不可能的,那么请与那些告诉您编写此类单元测试的人交谈。做一些前期研究;创建统计数据,比如:您在这些测试中发现了多少bug(可能是:0)。然后:说服你的同龄人真正的问题是什么;编写这样的单元测试(很可能)浪费了每个人的时间和精力
意思:编写单元测试并不是为了实现“100%覆盖率”,也不是为了允许在一些“hasaunittest”电子表格中打勾
它们是用来验证代码的;帮助您查找并修复错误。也许我错了;但是你在这里展示的东西看起来不像是“有用的”类别。给了你一个完全没有答案的答案:我认为你走错了兔子洞
任何需要如此多测试设置的类,正如您在这里所展示的,都显然违反了规则
单元测试只能在用于小的、可测试的生产代码单元时展现其优点。但是,为了设置测试用例,您需要10+个模拟,并在4个类中模拟静态方法
这是我个人的观点,但基于很多经验:这样的测试对你没有帮助。您需要花费小时编写测试代码,只需遵循生产代码的实现。这样你就找不到虫子了
只有在必须更改生产代码时,您才会发现单元测试中断。更糟糕的是:即使是最简单的重构也可能立即破坏这样的单元测试。当模拟静态内容时,即使是另一个类中与之无关的更改也有可能在其他地方变成失败的单元测试
这种单元测试对您的工作没有帮助;相反,它们会让你慢下来
换句话说:您不应该花时间去理解为什么PowerMock在这里让您失败(因为您在测试用例中做了一些错误的事情)。相反,你应该做两件事中的一件:
- 如果可能,请重新设计生产代码。面向对象设计;开始修复迄今为止造成的混乱!学习如何编写代码
- 如果这是不可能的,那么请与那些告诉您编写此类单元测试的人交谈。做一些前期研究;创建统计数据,比如:您在这些测试中发现了多少bug(可能是:0)。然后:说服你的同龄人真正的问题是什么;编写这样的单元测试(很可能)浪费了每个人的时间和精力
意思:编写单元测试并不是为了实现“100%覆盖率”,也不是为了允许在一些“hasaunittest”电子表格中打勾
它们是用来验证代码的;帮助您查找并修复错误。也许我错了;但是你在这里展示的东西看起来不像是“有用的”类别。为什么