gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:34:20 24 4
gpt4 key购买 nike

我一直在尝试测试这个场景,但我找不到测试它的好方法。因此,这个正在测试的方法创建了一个特定自定义类型的新对象,该对象随后调用一个方法。 现在,在调试过程中,当我的代码到达此点时,它检测到正在创建新对象,但是当它进入该方法时,它会爆炸,因为某些字段不存在已初始化。我正在测试的类(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com