gpt4 book ai didi

java - 如何避免 NullPointerException Junit RestTemplate

转载 作者:太空宇宙 更新时间:2023-11-04 09:07:53 25 4
gpt4 key购买 nike

我正在 spring 项目中工作,其中我有一个使用 Restemplate 调用另一个 api 的服务,该服务仅返回一个字符串作为 token ,一切对我来说都很好,这是我的服务:

@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);

你知道我的测试有什么问题吗?我花了几个小时没有任何结果

提前致谢

最佳答案

你的问题是,在你的服务中你 Autowiring restTemplate,但在你的测试中你自己初始化你的类,而不是通过spring,因此它没有初始化并保持为空。

如果您在测试中自行初始化服务,请确保添加 restTemplate 的模拟实例。我建议将服务中的 Autowiring 移动为基于c'tor,然后在测试中就很容易做到这一点:

 @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);
}

关于java - 如何避免 NullPointerException Junit RestTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60006701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com