Java 当数据库中找不到某些数据时,如何为异常场景编写Junit测试

Java 当数据库中找不到某些数据时,如何为异常场景编写Junit测试,java,junit,mocking,Java,Junit,Mocking,我是一名初级开发人员,正在从事一个项目。我几乎没有经验 我需要为未找到用户和未找到公司异常场景编写单元测试 当在数据库中找不到用户ID和公司ID时,会出现这些异常 代码片段如下所示: CompanyServiceImpl @Override public CompanyResponse getCompanyByUserId(String userId) { Optional<User> optionalUser = userRepository.findUs

我是一名初级开发人员,正在从事一个项目。我几乎没有经验

我需要为
未找到用户
未找到公司
异常场景编写单元测试

当在数据库中找不到
用户ID
公司ID
时,会出现这些异常

代码片段如下所示:

CompanyServiceImpl

 @Override
    public CompanyResponse getCompanyByUserId(String userId) {
        Optional<User> optionalUser = userRepository.findUserByUserId(userId);
        if(optionalUser.isEmpty()){
            throw new CompanyManagerException(USER_NOT_FOUND);
        }

        User user = optionalUser.get();

        Optional<Company> optionalCompany = companyRepository.findCompanyByCompanyName(user.getCompanyName());
        if(optionalCompany.isEmpty()){
            throw new CompanyManagerException(COMPANY_NOT_FOUND);
        }

您可以假设添加了相关的依赖项(Junit、Mockito等)。

我认为这应该满足您的要求。您可能需要编写两个单独的测试用例来涵盖“用户未找到”和“公司未找到”。 未找到用户的测试用例:

@Test(expected = CompanyManagerException.class)
public void testGetCompanyShoukdThrowException(){
String userId = "UserId";
when(companyService.getCompanyByUserId(userId)).thenThrow(new CompanyManagerException("USER_NOT_FOUND"));

//actual call and assert statements will go here

}

如果不想使用前面的方法手动抛出finduserbyUserRepository,则需要模拟UserRepository并在调用findUserByUserId时返回空

when(userRepository.findUserByUserId(userId)).thenReturn(Optional.empty());

您需要在测试类中模拟
companyRepository
userRepository

我假设您的
getCompanyByUserId
CompanyService
类中

@Mock
private CompanyRepository companyRepository;

@Mock
private UserRepository userRepository;

@InjectMocks
private CompanyService service;

@Test
public void testGetCompanyByUserIdException() {
    Mockito.when(userRepository.findUserByUserId(Mockito.anyString())).thenReturn("");
    Mockito.when(companyRepository.findCompanyByCompanyName(Mockito.anyString())).thenReturn(null);
    try {
        service.getCompanyByUserId("");
    } catch(CompanyManagerException ex) {
    //assert here for COMPANY_NOT_FOUND
    }
}

您可以假设所需的所有库都已导入(如junit、lombok、assertj等)
@Mock
private CompanyRepository companyRepository;

@Mock
private UserRepository userRepository;

@InjectMocks
private CompanyService service;

@Test
public void testGetCompanyByUserIdException() {
    Mockito.when(userRepository.findUserByUserId(Mockito.anyString())).thenReturn("");
    Mockito.when(companyRepository.findCompanyByCompanyName(Mockito.anyString())).thenReturn(null);
    try {
        service.getCompanyByUserId("");
    } catch(CompanyManagerException ex) {
    //assert here for COMPANY_NOT_FOUND
    }
}