Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito mocked方法返回null_Java_Spring_Spring Boot_Mocking_Mockito - Fatal编程技术网

Java Mockito mocked方法返回null

Java Mockito mocked方法返回null,java,spring,spring-boot,mocking,mockito,Java,Spring,Spring Boot,Mocking,Mockito,我认为这是一个非常标准的StorageService,它存在于Spring Boot应用程序中,用于web API @组件 @服务 @Slf4j 公共类存储服务{ @自动连线 私有AmazonS3 S3客户端; @自动连线 私有RestTemplate RestTemplate; @值(${app.aws.s3.bucket}”) 私有串桶; @异步的 公共布尔值fetchAndUpload(列表URI){ List futures=uris.stream().map(uri-> fetchAs

我认为这是一个非常标准的StorageService,它存在于Spring Boot应用程序中,用于web API

@组件
@服务
@Slf4j
公共类存储服务{
@自动连线
私有AmazonS3 S3客户端;
@自动连线
私有RestTemplate RestTemplate;
@值(${app.aws.s3.bucket}”)
私有串桶;
@异步的
公共布尔值fetchAndUpload(列表URI){
List futures=uris.stream().map(uri->
fetchAsync(uri).thenApplyAsync((资产)->put(getName(uri.toString()),资产))
).collect(Collectors.toList());
CompletableFuture.allOf(futures.toArray(新的CompletableFuture[futures.size())).join();
返回true;
}
@异步的
专用CompletableFuture fetchAsync(URI){
返回CompletableFuture.SupplySync(()->{
输入流响应;
试一试{
//当运行我的单元测试时,asdf在这里为空
Resource asdf=restemplate.getForObject(uri,Resource.class);
resp=Objects.requirennull(asdf.getInputStream();
}捕获(IOE异常){
抛出新的运行时异常(e);
}
返回响应;
});
}
私有PutObjectResult put(字符串名称、InputStream数据){
PutObjectRequest=new PutObjectRequest(bucket、name、data、new ObjectMetadata());
返回s3Client.putObject(请求);
}
}
下面是一个集成测试,它至少成功地获取了集成测试给出的图像:

@RunWith(SpringRunner.class)
@春靴测试
@自动配置Web客户端
公共类存储服务IT{
@值(${app.aws.s3.access.key})
私有字符串访问密钥;
@值(${app.aws.s3.secret.key”)
私钥;
@间谍
私有AmazonS3 s3Client=AmazonS3ClientBuilder.standard()
.具有凭据(新的AWSStaticCredentialsProvider(新的基本凭据(accessKey、secretKey)))
.withRegion(Regions.US_EAST_1)
.build();
@间谍
私有RestTemplate RestTemplate=新建RestTemplateBuilder().build();
@蚕豆
私人签名服务;
@自动连线
专用存储服务存储服务;
@以前
public void setUp()引发异常{
initMocks(this);
}
@试验
public void fetchAsync()引发URISyntaxException{
List uris=List.of(
新URI(“https://upload.wikimedia.org/wikipedia/commons/e/ec/Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg"),
新URI(“https://upload.wikimedia.org/wikipedia/commons/e/ec/Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg")
);
获取和上传(URI);
}
}
但是,下面的单元测试没有成功模拟
restemplate.getForObject
调用,即使将两个参数都设置为
any()
,它也会不断返回null

@RunWith(SpringRunner.class)
@春靴测试
@自动配置Web客户端
公共类StorageServiceTest{
@蚕豆
私有AmazonS3 S3客户端;
@蚕豆
私有RestTemplate RestTemplate;
@蚕豆
私人签名服务;
@自动连线
//@mocks???
专用存储服务存储服务;
@值(${app.aws.s3.bucket}”)
私有串桶;
@以前
public void setUp()引发异常{
initMocks(this);
}
列出随机URI(int num){
最终字符串基数=”https://example.com/%s";
返回流。迭代(0,i->i)
.limit(num)
.map(o->URI.create(String.format(base,UUID.randomUUID().toString()))
.collect(Collectors.toList());
}
@试验
公共void fetchAsyncTest(){
列表URI=随机URI(2);
forEach(uri->{
ByteArrayInputStream数据=新建ByteArrayInputStream(
Integer.toString(uri.hashCode()).getBytes());
PutObjectRequest=新的PutObjectRequest(
bucket、getName(uri.toString())、数据、新ObjectMetadata();
Resource getResult=mock(Resource.class);
试一试{
doReturn(数据).when(getResult).getInputStream();
}捕获(IOE异常){
e、 printStackTrace();
}
doReturn(data).when(restTemplate).getForObject(any(),any());
//没有人在工作
//doReturn(数据).when(restTemplate).getForObject(eq(uri),eq(Resource.class));
//doReturn(数据).when(restTemplate).getForObject(uri,Resource.class);
//当(restemplate.getForObject(uri,Resource.class)).thenReturn(数据);
//当(restTemplate.getForObject(eq(uri)、eq(Resource.class)))。然后返回(数据);
//当(restTemplate.getForObject(any(),any())。然后返回(data);
PutObjectResult res=新的PutObjectResult();
doReturn(res).when(s3Client.putObject)(eq(request));
//我想也不是在这里工作
//doReturn(res).when(s3Client).putObject(请求);
//doReturn(res).when(s3Client).putObject(any());
//当(s3Client.putObject(eq(request)),然后返回(res);
//当(s3Client.putObject(request)),然后返回(res);
//当(s3Client.putObject(any())。然后返回(res);
});
布尔res=storageService.fetchAndUpload(URI);
}
}
为了以防万一,这就是我如何构建
restmplate

@Bean
公共RestTemplate RestTemplate(RestTemplateBuilder){
返回builder.build();
}

我被难住了,所有的建议都很感谢!:|

要跟进这个问题-我的问题是因为我尝试测试的方法被Spring Boot的
@Async
注释标记,导致了竞争条件和竞争