Как избежать NullPointerException Junit RestTemplate - PullRequest
1 голос
/ 31 января 2020

Я работаю в весеннем проекте, где у меня есть сервис, который вызывает другой API, используя Restemplate, этот сервис возвращает только строку в качестве токена, и все работает нормально для меня, это мой сервис:

@Service
public class AppServiceImpl {

    @Value("${rest.appUrl}")
    private String appUrl;

    @Value("${credType}")
    private String credType;

    @Autowired
    private RestTemplate restTemplate;

    public String getToken() {

        HttpHeaders headers = new HttpHeaders();

        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();

        map.add("grant_type", credType);

        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);

        ResponseEntity<TargetObject> response = restTemplate.exchange(appUrl, HttpMethod.POST, request, TargetObject.class);

        TargetObject targetObject = response.getBody();

        return "Bearer " + targetObject.getToken();

    }

}

моя проблема в том, что когда я хочу выполнить модульное тестирование этого сервиса, я получаю NullPointerException, и я не знаю почему, это мой модульный тест:

@RunWith(SpringRunner.class)
public class AppServiceImplTest {

    private AppService appService = new AppServiceImpl();

    @Test
    public void getTokenTest() {

        String token = appService.getToken();

        assertTrue(token != null);
    }

}

NullPointerException в этой строке:

ResponseEntity<TargetObject> response = restTemplate.exchange(appUrl, HttpMethod.POST, request, TargetObject.class);

Ты хоть представляешь, в чем проблема с моим тестом? Я провел часы без какого-либо результата

Заранее спасибо

1 Ответ

0 голосов
/ 31 января 2020

ваша проблема в том, что в вашем сервисе вы автоматически подключаете restTemplate, но в своем тесте вы инициализируете свой класс самостоятельно, а не через пружину, и там он не инициализируется и остается нулевым.

, если вы сами инициализируете сервис в тесте, убедитесь, что добавили макетный экземпляр restTemplate. Я предлагаю переместить автопровод в сервисе на c 'на основе, и тогда это будет легко сделать в тесте:

 @Service
 public class AppServiceImpl {

    private String appUrl;
    private String credType;
    private RestTemplate restTemplate;

    public AppServiceImpl(RestTemplate restTemplate, @Value("${credType}") String credType, @Value("${rest.appUrl}") String appUrl) {
      this.restTemplate = restTemplate;
      this.credType = credType;
      this.appUrl = appUrl;
    }

...
...
...
}

и позже в вашем тесте:

@Mock private RestTemplate restTamplate;
private AppService appService;

@Before
public void setup() {
  appService = new AppServiceImpl(restTamplate);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...