首页 > 解决方案 > 使用 mockito 的空指针问题

问题描述

我正在尝试测试一种方法。在这个方法中,实例化了一个新的对象,但我不想要它,否则会测试其他类。我如何告诉模仿者不要煽动它?

@Component
@EnableScheduling
public 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 {

@InjectMocks
private VerificadorDeNovasAssinaturas verificador;

private DocuSignProperties docuSignProperties;
private ApiClient apiClient;
private UserInfo userInfo; 
private OAuthToken oAuthToken;

@Mock
private DocuSign docuSign;


@Before
public 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,因为这不是测试的原因。有什么方法可以忽略这一步吗?

标签: javaspringjunitmockito

解决方案


好吧,如果您的代码(要测试的代码,您打算执行的代码)执行某些操作,则 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);

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


推荐阅读