Проблемы с нулевым указателем при использовании mockito - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь проверить метод. И в этом методе создается новый объект, но я не хочу его, иначе будет протестирован другой класс. Как мне сказать, чтобы 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, потому что это не является причинойтест. Есть ли способ игнорировать этот шаг?

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Что ж, Mockito не может что-то изменить, если ваш код (проверяемый код, который вы намереваетесь) что-то делает, однако вы можете смоделировать это так, чтобы он не создавал новый объект (лучше иметь ваш "Mocked Object"), так что вы можете что-то проверить в соответствии с ожидаемым поведением.

В вашем коде, если вы измените несколько строк, вы можете достичь того, что вы хотите, например: создать класс 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);

Теперь у вас есть контроль над этим объектом.

0 голосов
/ 10 октября 2019
I resolved it using powerMockito.

DocuSign docuSign = PowerMockito.mock(DocuSign.class);
PowerMockito.whenNew(DocuSign.class).withAnyArguments().thenReturn(docuSign);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...