java - 如何在 Java 单元测试中测试更新方法
问题描述
我正在为我的 ServiceImpl 方法创建单元测试,并尝试为update
方法创建单元测试。但是,我不确定我应该如何测试这种方法。它返回DTO
相应的实体,但我真的不知道是否应该使用@Spy
or @Captor
。如果我设置了一个模拟变量,然后尝试检索它并更新它的值,我将需要检索相同的记录来检查它的更新值。
我是测试新手,我还没有找到合适的更新方法示例。任何帮助,将不胜感激。
public CompanyDTO update(CompanyRequest companyRequest, UUID uuid) {
final Company company = companyRepository.findByUuid(uuid)
.orElseThrow(() -> new EntityNotFoundException(COMPANY));
company.setName(companyRequest.getName());
final Company savedCompany = companyRepository.save(company);
return new CompanyDTO(savedCompany);
}
更新:最后我让它工作了,但我不确定某些部分。下面的测试方法有什么遗漏或多余的吗?
@InjectMocks
private CompanyServiceImpl companyService;
@Mock
private CompanyRepository companyRepository;
@Captor
ArgumentCaptor<Company> companyCaptorEntity;
@Test
public void testUpdate() {
final UUID uuid = UUID.randomUUID();
final CompanyRequest request = new CompanyRequest();
request.setName("Updated Company Name");
final Company company = new Company();
company.setName("Company Name");
when(companyRepository.findByUuid(uuid))
.thenReturn(Optional.ofNullable(company));
//??? Do we need this?
when(companyRepository.save(any())).thenReturn(company);
CompanyDTO result = companyService.update(request, uuid);
Mockito.verify(companyRepository).save(companyCaptor.capture());
Company savedCompany = companyCaptor.getValue();
assertEquals(request.getName(), savedCompany.getName());
}
解决方案
比update()
方法的返回类型更重要的是,我相信您应该测试传递给save()
模拟存储库方法的实体的值(我假设您有一个)。
为此,您可以使用ArgumentCaptor
.
为了测试方法的返回逻辑update()
,您可以简单地将其在测试中的结果分配给响应对象。然后,您可以将此对象与输入对象的值进行比较。
这是一个测试模拟存储库的保存方法的参数和更新方法的返回的示例(它们应该是两个不同的单元测试):
@Test
void test() {
// Arrange
ArgumentCaptor<Entity> entityArgumentCaptor = ArgumentCaptor.forClass(Entity.class);
InputDto inputDto = prepareTestInput();
// Act
ResponseDto responseDto = service.update(inputDto);
verify(repositoryMock, times(1)).save(entityArgumentCaptor.capture());
// Assert
Entity savedEntity = argumentCaptor.getValue();
assertEquals(input.getVariable1(), savedEntity.getVariable1());
// .....
// compare ResponseDto and InputDto too
}
推荐阅读
- ios - 如何快速增加阴影不透明度?
- mysql - 我怎样才能制作一个mysql批量更新存储过程?
- express - Electron,ipcMain.on 如果它在函数内部,则不会发送
- python - 我是 pygame 的新手,希望得到 get_rect() 的帮助吗?
- java - 我可以在 for 循环中运行 while 循环吗?[Java] 如果是这样,在这种情况下我会怎么做?
- c# - C# 从 url 获取 html。错误 (429) 未知
- single-sign-on - MSAL 浏览器扩展 AAD 会话
- plsql - 如何在包含两个插入语句的oracle中执行存储过程?
- python - 使用python读取json文件
- ios - 仅 iPad SwiftUI 横向