java - 如何在没有 Mocking 框架的情况下测试调用另一个类中另一个方法的方法

标签 java junit mockito powermock

我一直在尝试测试这个场景,但我找不到测试它的好方法。因此,这个正在测试的方法创建了一个特定自定义类型的新对象,该对象随后调用一个方法。 现在,在调试过程中,当我的代码到达此点时,它检测到正在创建新对象,但是当它进入该方法时,它会爆炸,因为某些字段不存在已初始化。我正在测试的类(class)和我的测试失败的类(class)之间没有任何关系。没有任何 Mocking 框架有办法测试这一点。我也无法更改源代码。如果它是一个坏代码,我仍然可以测试它。

class DocuSigRESTProvider{
 public IDocumentSet sendDocuments() {
 /// code...
 ITransformer transformer = new SendDocumentsRESTTransformer();
 ITransformerResult result = transformer.transformRequest(args);
 }
}

当代码进入transformrequest()时,它会因为某些字段而爆炸。它总是创建一个新的,所以即使在我的测试类中我创建了一个 SendDocumentRESTTransformer 实例,它也不会发现该特定字段在运行时被初始化。

JUnit

private SendDocumentsRESTTransformer sendDocumentRESTTransfomer;
private ITransformerResult iTransformerResult;   

sendDocumentRESTTransfomer = mock( SendDocumentsRESTTransformer.class );
iTransformerResult = mock( ITransformerResult.class );

@Test
public void testSendDocuments() throws Exception {
    DocusignRESTProvider docusignRestProvider = new DocusignRESTProvider();
    docusignRestProvider.setLoggingHandler( iloggingHandler );
    docusignRestProvider.setDocumentManager( iDocumentManager );
    docusignRestProvider.setConfiguration( iProviderConfiguration );
    docusignRestProvider.setManager( idocTranManager );
    docusignRestProvider.setEmailProcessor( emailProcessor );

    List<IDocumentDto> iDocumentDtoList = new ArrayList<>();
    iDocumentDtoList.add( iDocumentDto );

    List<IDocument> iDocumentList = new ArrayList<>();
    iDocumentList.add( iDocument );

    when( restProvider.loadDocuments( iClientUserDto, iDocumentSet ) ).thenReturn( iDocumentDtoList );
    when( iDocumentSet.getDocuments() ).thenReturn( iDocumentList );
    when( restProvider.validateDocs( anyListOf( IDocument.class ), anyListOf( IDocumentDto.class ) ) ).thenReturn( iDocumentDtoList );
    PowerMockito.whenNew( SendDocumentsRESTTransformer.class ).withAnyArguments().thenReturn( sendDocumentRESTTransfomer );
    when( sendDocumentRESTTransfomer.transformRequest( any( ITransformerArgs.class ) ) ).thenReturn( iTransformerResult );

    iDocumentSet = docusignRestProvider.sendDocuments( iClientUserDto, iDocumentSet );
    assertNotNull( iDocumentSet );
}

这段代码可以测试吗?

最佳答案

您可以创建一个 setter 方法来注入(inject)外部依赖项。 像这样的东西。

class DocuSigRESTProvider{
 private ITransformer transformer = new SendDocumentsRESTTransformer();

 public IDocumentSet sendDocuments() {
   /// code...
   ITransformerResult result = transformer.transformRequest(args);
 }
  //package level method
 void setTransformer(ITransformer transformer) {
    this.transformer = transformer
 }
}

然后您可以从测试类中注入(inject)一个 stub 对象。

@Test
public void myTest() {
  DocuSigRESTProvider docusignRestProvider = new DocuSigRESTProvider();
  docusignRestProvider.setTransformer(new SendDocumentsRESTTransformerStub());

  //...rest of test code.
}

private class SendDocumentsRESTTransformerStub extends SendDocumentsRESTTransformer {
  //... Override methods.
}

关于java - 如何在没有 Mocking 框架的情况下测试调用另一个类中另一个方法的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43504340/

相关文章:

java - 使用 PhantomJSDriver 的 Selenium 测试挂起且未完成

java - 当测试失败时,Selenium 无法终止浏览器

spring-boot - 使用 Mockito 模拟带有 @Transactional 方法的类

java - 如何使用 Selenium WebDriver 和 Java 在文本区域中输入 JSON?

java - 借助 AlertDialog 将新对象添加到自定义数组适配器

Javamail 奇怪的行为

java - PowerMock 模拟抽象类中的静态方法

c# - "static reflection"在 Java 中如何工作? (例如在 mockito 或 easymock 中)

Java G1GC 从不收集 Old Gen

java - 错误 : syntax error at or near "." in copy command using java?