为了账号安全,请及时绑定邮箱和手机立即绑定

使用mockito的空指针问题

使用mockito的空指针问题

森栏 2023-09-20 19:17:06
我正在尝试测试一种方法。在这个方法中,实例化了一个新对象,但我不想要它,否则将测试其他类。我如何告诉mockito不要实例化它?@Component@EnableSchedulingpublic class VerificadorDeNovasAssinaturas {     private DocuSign docuSign;    private ApiClient apiClient;    @Autowired    private DocuSignProperties docuSignProperties;    public EnvelopesInformation verificaNovasAssinaturas() throws Exception {        this.docuSign = new DocuSign(docuSignProperties); // I don't want mockito instanciate DocuSign        this.apiClient = docuSign.getApiClient();        this.apiClient.addDefaultHeader("Authorization", "Bearer " + docuSign.getoAuthToken().getAccessToken());还有我的测试课:@SpringBootTest@RunWith(SpringRunner.class)@ActiveProfiles("test")public class VerificadorDeNovasAssinaturasTest {@InjectMocksprivate VerificadorDeNovasAssinaturas verificador;private DocuSignProperties docuSignProperties;private ApiClient apiClient;private UserInfo userInfo; private OAuthToken oAuthToken;@Mockprivate DocuSign docuSign;@Beforepublic void initialize() throws Exception {    docuSignProperties = new DocuSignProperties();    docuSignProperties.setBaseUrl("https://demo.docusign.net/restapi");    docuSignProperties.setBasePath("/restapi");    setApiClientConfigurations();    when(docuSign.getApiClient()).thenReturn(this.apiClient);            when(docuSign.getoAuthToken()).thenReturn(this.oAuthToken);    ...}private void setApiClientConfigurations() throws Exception {    this.apiClient = new ApiClient(this.docuSignProperties.getBaseUrl());    this.oAuthToken = getOAuth();            ... } @Test public void testaVerificacaoDeNovasAssinaturas() throws Exception {    EnvelopesInformation results = verificador.verificaNovasAssinaturas();    assertNotNull(results);}我不想让mockito实例化一个新的DocuSign,因为这不是测试的原因。有什么方法可以忽略这一步吗?
查看完整描述

2 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

好吧,如果您的代码(要测试的代码,您打算这样做)做了某些事情,Mockito 无法更改某些内容,但是您可以模拟它,以便它不会创建新对象(而是创建您的“模拟对象”),这样您可以根据预期行为验证某些内容。


在您的代码中,如果您更改几行,您就可以实现您想要的,例如 - 创建一个 DocuSignService 类,然后在其中创建这个新对象 - getDocuSign 方法。然后你的代码如下所示 -


@Autowired

private DocuSignService docuSignService ;


this.docuSign = new DocuSign(docuSignProperties); // This is what you have

this.docuSign = this.docuSignService.getDocuSign() ; // This is new code

现在在你的测试用例中 -


@Mock

DocuSignService docuSignService ;

@Mock

private DocuSign docuSign;

//.

//.

Mockito.when(this.docuSignService.getDocuSign()).thenReturn(docuSign);

现在你可以控制这个对象了。


查看完整回答
反对 回复 2023-09-20
?
月关宝盒

TA贡献1772条经验 获得超5个赞

I resolved it using powerMockito.


DocuSign docuSign = PowerMockito.mock(DocuSign.class);

PowerMockito.whenNew(DocuSign.class).withAnyArguments().thenReturn(docuSign);


查看完整回答
反对 回复 2023-09-20
  • 2 回答
  • 0 关注
  • 218 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信