Mockito mock дает ноль для данных тестов - PullRequest
0 голосов
/ 09 марта 2020

Я использую SpringRunner для запуска тестового примера Junit mockito, ниже приведен класс, я пытался написать тестовый пример, но получаю нулевой объект

    public class AccountManager {

        public String getToken() throws Exception {
               @Autowired
               RestClient restClient;

                String auth = apiUserPrefix + apiUserName + BatchJobConstants.COLON + apiUserPassword;
                byte[] encodedAuth = Base64.encodeBase64(
                        auth.getBytes(StandardCharsets.UTF_8));
                String authHeader = BatchJobConstants.BASIC_SPACE + new String(encodedAuth);
                String token= null;
                MultiValueMap<String, String> data = new LinkedMultiValueMap<>();
                data.add("grant_type", "client_credential");
                String accManagerUrl = accManagerHost+":"+accManagerPort+"/"+accManagerResPath;
                RestResponseObject responseObject = null;

                try {
                    responseObject = restClient.execute(accManagerUrl, HttpMethod.POST, data, String.class, authHeader);
                    if (responseObject != null && responseObject.getPayload() != null && responseObject.getStatusCode() == HttpStatus.OK) {
                        JsonElement responseJson = (JsonElement) responseObject.getPayload();
                        if (responseJson.isJsonObject()) {
                            token= responseJson.getAsJsonObject().get(BatchJobConstants.ACCESS_TOKEN).getAsString();
                        }catch(RunTimeException e) {
//e
}
    return token;
        }

// Тестовый пример Junit

@RunWith(SpringRunner.class)
    public class AccountManagerTest {
    @InjectMocks
        AccountManager accountManager;
    @Mock
         RestClient restClient;
 @Test
    public void getTokenAccMgrSucess() throws Exception {
        RestResponseObject restResponseObject = Mockito.mock(RestResponseObject.class);

        Mockito.when(restClient.execute(Mockito.anyString(), Mockito.any(HttpMethod.class),
                Mockito.anyString(), Mockito.eq(String.class), Mockito.anyString())).thenReturn(restResponseObject);
        String token = accountManagerTokenProvider.getToken();
        Assert.assertEquals("Token value {} ", null, token);

    }

    }

Но все равно приведенный ниже код возвращает нулевое значение, даже после насмешки, не могли бы вы помочь, как смоделировать это.

responseObject = restClient.execute(accManagerUrl, HttpMethod.POST, data, String.class, authHeader);

Примечание: Только Mockito нужно не использовать powermockito

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Для полей с автопроводкой вам нужно не только смоделировать их, но и связать класс с привязкой к контексту пружины. У вас есть два варианта:

1. Отметьте макетированный класс как основной компонент

@Configuration
    public class TestConfiguration {
        @Bean
        @Primary
        public RestClient restClient() {
            return Mockito.mock(RestClient.class);
        }
    }

2.Используйте аннотацию @MockBean

 @MockBean
 RestClient restClient;

Подробнее об этом:
https://www.baeldung.com/injecting-mocks-in-spring
https://www.baeldung.com/java-spring-mockito-mock-mockbean

0 голосов
/ 09 марта 2020

Наконец-то с mockito работал только пользователь user () вместо anyString (), поскольку объект не соответствует только строке

Mockito.when(restClient.execute(Mockito.any(), Mockito.any(HttpMethod.class),
                Mockito.any(), Mockito.eq(String.class), Mockito.any())).thenReturn(restResponseObject);
...