when(task.getCleanDirs().add(any())).thenReturn(null);这样写有什么问题
时间: 2023-12-03 18:02:57 浏览: 45
这段代码中的`thenReturn(null)`会导致`add()`方法返回`null`,这可能会在后续代码中引起空指针异常。因此,应该考虑返回一个合适的对象或者使用`doNothing()`方法来避免这种潜在问题。例如:`when(task.getCleanDirs().add(any())).thenReturn(new Object());` 或者 `doNothing().when(task.getCleanDirs()).add(any());`。
相关问题
@Test public void testInit_null() throws Exception{ // when(ftpClientService.getFtpClient(any())).thenReturn(null); //when(task.getCleanDirs().add(any())).thenReturn(null); FileCleanTask task=new FileCleanTask(); task.getCleanDirs().add(""); List<FileCleanTask>tasks=Arrays.asList(task); if(tasks.isEmpty()) { try { Thread.sleep(60000); } catch (InterruptedException e) { log.error("InterruptedException while sleeping",e); } } // when(ftpManagerClient.getCleanTasks(0)).thenReturn(null); //doNothing().when(task.).add(any()); cleanTaskPollService.init(); }怎么调成tasks.isEmpty为1使得UT
可以通过以下方式将 `tasks.isEmpty()` 的返回值设置为 1:
```
@Test
public void testInit_null() throws Exception{
// when(ftpClientService.getFtpClient(any())).thenReturn(null);
//when(task.getCleanDirs().add(any())).thenReturn(null);
FileCleanTask task=new FileCleanTask();
task.getCleanDirs().add("");
List<FileCleanTask>tasks=Arrays.asList(task);
if(tasks.size() == 0) // 修改此处的判断条件
{
try {
Thread.sleep(60000);
} catch (InterruptedException e) {
log.error("InterruptedException while sleeping",e);
}
}
// when(ftpManagerClient.getCleanTasks(0)).thenReturn(null);
//doNothing().when(task.).add(any());
cleanTaskPollService.init();
}
```
将原来的 `tasks.isEmpty()` 改为 `tasks.size() == 0` 即可。
private class TaskPollRunnable implements Runnable { @Override public void run() { FileCleanTaskResponse poll = pollTasks(1); List<FileCleanTask> tasks = poll.getCleanTasks(); log.info("cleantasks:"+tasks); if(tasks.isEmpty()){ try { Thread.sleep(60000); } catch (InterruptedException e) { e.printStackTrace(); } } long startTimeMills = System.currentTimeMillis(); List<Future> futures = new ArrayList<>(); for(FileCleanTask task : tasks){ List<String> dirs = task.getCleanDirs(); log.info("cleandirs:"+dirs); dirs.stream().forEach(dir->{ Future future = executor.submit(new FileCleanRunnable(dir));//1个网元1个线程 futures.add(future); }); } //等待所有线程执行结束 for(Future future:futures){ try { future.get(); } catch (InterruptedException e) { log.error("clean task interupt",e); } catch (ExecutionException e) { log.error("clean task ",e); } } log.info("ALL File clean thread finish,cost: {} ms",(System.currentTimeMillis() - startTimeMills)); }写 ut
好的,以下是该代码的一个可能的UT:
```java
@Test
public void testTaskPollRunnable() throws ExecutionException, InterruptedException {
// 准备测试数据
FileCleanTaskResponse response = new FileCleanTaskResponse();
List<FileCleanTask> tasks = new ArrayList<>();
FileCleanTask task1 = new FileCleanTask();
List<String> dirs1 = new ArrayList<>();
dirs1.add("/tmp/dir1");
dirs1.add("/tmp/dir2");
task1.setCleanDirs(dirs1);
tasks.add(task1);
response.setCleanTasks(tasks);
// mock pollTasks方法返回值
when(mockedFileCleanService.pollTasks(anyInt())).thenReturn(response);
// mock executor.submit方法,直接调用run方法执行
doAnswer(invocation -> {
((Runnable) invocation.getArgument(0)).run();
return null;
}).when(mockedExecutor).submit(any(Runnable.class));
// 执行测试
TaskPollRunnable taskPollRunnable = new TaskPollRunnable();
taskPollRunnable.setFileCleanService(mockedFileCleanService);
taskPollRunnable.setExecutor(mockedExecutor);
taskPollRunnable.run();
// 验证结果
verify(mockedFileCleanService, times(1)).pollTasks(1);
verify(mockedExecutor, times(2)).submit(any(Runnable.class)); // 共两个目录,两个线程
}
```
需要注意的是,该UT使用了Mockito框架,需要先导入Mockito相关的依赖。同时,由于该代码中使用了线程池,需要使用Mockito的doAnswer方法模拟线程池的submit方法,使得测试中的线程直接调用run方法执行。
阅读全文