繁体   English   中英

如何为代码覆盖编写 Junit 测试类

[英]How to write Junit test class for code coverage

有人可以帮我为下面的 serviceImpl 类编写 JUnit

@Component
public class ProcessStatusMasterServiceImpl implements ProcessStatusMasterService {
  @Autowired
  private ProcessStatusRepository processStatusRepository;
  
  @Autowired
  private ApplicationContext applicationContext;
  
  public ProcessAndMacroStatus findProcessMaster(StatusConstant statusConstants) {
    ProcessStatusMasterService thisBean = (ProcessStatusMasterService)this.applicationContext.getBean(ProcessStatusMasterService.class);
    List<ProcessAndMacroStatus> processStatuses = thisBean.findProcessMasterByCategory(statusConstants.getCategory());
    Optional<ProcessAndMacroStatus> processStatusOpt = processStatuses.stream().filter(f -> f.getProcessAndMacroStatusKey().equals(statusConstants.getKey())).findFirst();
    if (processStatusOpt.isPresent())
      return processStatusOpt.get(); 
    throw new IllegalArgumentException("Unable to find status: " + statusConstants.getKey() + " for category: " + statusConstants.getCategory());
  }
  
  @Cacheable({"ProcessStatusMasterCache"})
  public List<ProcessAndMacroStatus> findProcessMasterByCategory(String category) {
    List<ProcessAndMacroStatus> processStatuses = this.processStatusRepository.findByProcessMacroStatusCategory(category);
    return processStatuses;
  }
}

下面是我正在尝试的代码,但是when(thisBean.findProcessMasterByCategory(StatusConstant.GROUP_STATUS_SUCCESS.getCategory())).thenReturn(processStatuses);

这个变量 thisbean 的原因是 null

@RunWith(MockitoJUnitRunner.class)
public class ProcessStatusMasterServiceImplTest {

    @Mock
    ProcessStatusRepository processStatusRepository;

    @Mock
    ApplicationContext applicationContext;

    @InjectMocks
    ProcessStatusMasterServiceImpl processStatusMasterServiceImpl;

    @Test
    public void findProcessMaster() throws Exception {
        ProcessStatusMasterService thisBean = (ProcessStatusMasterService)this.applicationContext.getBean(ProcessStatusMasterService.class);
        List<ProcessAndMacroStatus> processStatuses=new ArrayList<ProcessAndMacroStatus>();
        when(thisBean.findProcessMasterByCategory(StatusConstant.GROUP_STATUS_SUCCESS.getCategory())).thenReturn(processStatuses);

        processStatusMasterServiceImpl.findProcessMaster(StatusConstant.GROUP_STATUS_SUCCESS);
        
    }

}

我认为您正在尝试模拟被测试实体本身的行为,而不是模拟依赖项。 我会尝试像这样嘲笑它:

@Test
public void findProcessMaster() throws Exception {
    List<ProcessAndMacroStatus> processStatuses=new ArrayList<ProcessAndMacroStatus>();
    when(processStatusRepository.findProcessMasterByCategory(StatusConstant.GROUP_STATUS_SUCCESS.getCategory())).thenReturn(processStatuses);

    processStatusMasterServiceImpl.findProcessMaster(StatusConstant.GROUP_STATUS_SUCCESS);
    
}

请在您的生产代码中删除您的thisBean ,只需使用this. 反而。

List<ProcessAndMacroStatus> processStatuses = this.findProcessMasterByCategory(statusConstants.getCategory());

并修改您的测试

@Test
public void findProcessMaster() throws Exception {
    List<ProcessAndMacroStatus> processStatuses = new ArrayList<ProcessAndMacroStatus> ();
    when(processStatusRepository.findProcessMasterByCategory(StatusConstant.GROUP_STATUS_SUCCESS.getCategory())).thenReturn(processStatuses);

    processStatusMasterServiceImpl.findProcessMaster(StatusConstant.GROUP_STATUS_SUCCESS);

    // your assert
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM