gpt4 book ai didi

java - Mockito测试抛出 "URI is not absolute"错误

转载 作者:行者123 更新时间:2023-12-01 19:22:18 24 4
gpt4 key购买 nike

我正在尝试使用 postForEntity 调用来模拟此方法 -


public AuthorizeClient(RestTemplateBuilder builder, Config config) {
this.grantedUrl = config.grantedUrl();
this.restTemplate = HttpClientHelper.getRestTemplate(builder, authorizationConfig);
}

private final RestTemplate restTemplate;
private String grantedUrl;
public List<Permission> getPermissions(
PermissionsRequest permissionsRequest) {
try {
var headers = new HttpHeaders();
var request = new HttpEntity<PermissionsRequest>(permissionsRequest, headers);
var permissions = restTemplate.postForEntity(grantedUrl, request, Permission[].class);
return Arrays.asList(permissions.getBody());
} catch (HttpClientErrorException err) {
logger.error(err);
throw err;
}
}

这是我的测试用例 -

RestTemplateBuilder restTemplateBuilder =  new RestTemplateBuilder();

Config config = new Config();

@InjectMocks
AuthorizeClient authorizeClient = new AuthorizeClient(restTemplateBuilder, config);

@Mock
private RestTemplate restTemplate;

PermissionsRequest permissionsRequest;

ResponseEntity<Permission[]> expGrantedPermissions;

@Test
public void testAuthorizationPermissions() {

when(restTemplate.postForEntity(anyString(), any(), eq(Permission[].class))).thenReturn(expGrantedPermissions);

var res = authorizeClient.getAllGrantedPermissions(permissionsRequest);
assertNotNull(res);

}

我收到此错误。看起来模拟没有正确创建..

java.lang.IllegalArgumentException: URI is not absolute

在这一行 -

var res = AuthorizeClient.getPermissions(permissionsRequest);

我的 AuthorizeClient 的构造如上..

请建议我缺少什么。

提前致谢

最佳答案

从您的示例代码中,我没有看到您的 restTemplate 之间的关系模拟和 AuthorizeClient类(class)。

问题是你的restTemplate您对象中的字段是 final 。在这种情况下 - 即使如此 @InjectMocks通常与new一起使用构造函数 - 不会发生模拟注入(inject)。

您可能想要添加完整的堆栈跟踪,但我假设 config.grantedUrl()不返回有效的网址。

<小时/>

我假设grantedUrlString 。在这种情况下,您为错误的方法定义了行为。 postForEntity 只有 4 参数版本,因此您需要使用 Mockito.<Object>any() 定义模拟。对于 varargs 参数。

<小时/>

要解决此问题:您可能需要模拟 RestTemplateBuilder并定义 HttpClientHelper.getRestTemplate 使用的方法的行为.

您可能还想考虑使用PowerMockito直接模拟静态方法。

或者,您可以重构代码以传递 RestTemplate直接传递给构造函数而不是传递构建器。至少在您的示例中,构建器似乎没有用于类中的其他任何内容,因此我将其视为可移动的依赖项。

还使用 Constructor injection被许多人认为是可行的方法。

<小时/>

我假设PermissionsRequest and Permission` 是你的类,所以我无法真正测试这个特定的情况,但基本上这应该有效:

请注意,我假设 AuthorizeClient 的构造函数已更改接受 configrestTemplate 。我没有使用注释,而是手动设置模拟,因为您使用了真实的 Config你的例子中的对象。如果可以选择模拟两者,您仍然可以使用 @InjectMocks注释。

@RunWith(MockitoJUnitRunner.class)
public class RestTemplateTest {

Config config = new Config();

@Mock
private RestTemplate restTemplate;

PermissionsRequest permissionsRequest;
ResponseEntity<Permission[]> expGrantedPermissions;

@Test
public void testAuthorizationPermissions() {

// init permissionsRequest and expGrantedPermissions, if you haven't done that
AuthorizeClient authorizeClient = new AuthorizeClient(config, restTemplate);

Mockito.when(restTemplate.postForEntity(Mockito.anyString(), Mockito.any(), Mockito.eq(Permission[].class), Mockito.<Object>any())).thenReturn(expGrantedPermissions);

List<Permission> res = authorizeClient.getAllGrantedPermissions(permissionsRequest);
assertNotNull(res);
}
}
<小时/>

PS:
有关 restTemplate 上不同方法的独立示例你可以查看我的回答 here 。这至少可以帮助您验证您是否模拟了正确的方法。

关于java - Mockito测试抛出 "URI is not absolute"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59345357/

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