Estou realizando os testes unitários de uma API que venho desenvolvendo e tive o seguinte problema: Não sei como mockar o resultado de um método referenciado com this
.
Classe de Teste:
class CompanyServiceTest {
@Mock
private JwtEncoder jwtEncoder;
@Mock
private PasswordEncoder encoder;
@Mock
private CompanyRepository companyRepository;
@InjectMocks
private CompanyService companyService;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
@DisplayName("Update Company Successfully")
void updateCompany_successful() {
Company company = mock(Company.class);
Set<Company> usedData = new HashSet<>();
var token = mock(JwtAuthenticationToken.class);
String encodedPassword = "Test Encoded Password";
UpdateCompanyDTO data = mock(UpdateCompanyDTO.class);
when(companyService.getCompany(token.getName())).thenReturn(company);
when(companyRepository.findAllByNameOrCnpj(any(), any())).thenReturn(usedData);
assertDoesNotThrow(() -> companyService.updateCompany(data, token));
verify(company, times(1)).setName(data.name());
verify(company, times(1)).setCnpj(data.cnpj());
verify(company, times(1)).setPassword(encodedPassword);
verify(companyService, times(1)).getCompany(token.getName());
verify(companyRepository, times(1)).findAllByNameOrCnpj(any(), any());
}
}
Classe Service:
@Service
public class CompanyService {
private final JwtEncoder jwtEncoder;
private final PasswordEncoder encoder;
private final CompanyRepository companyRepository;
public CompanyService(JwtEncoder jwtEncoder, PasswordEncoder encoder, CompanyRepository companyRepository) {
this.encoder = encoder;
this.jwtEncoder = jwtEncoder;
this.companyRepository = companyRepository;
}
public void updateCompany(UpdateCompanyDTO data, JwtAuthenticationToken token) {
Company company = this.getCompany(token.getName());
Set<Company> usedData = companyRepository.findAllByNameOrCnpj(data.name(), data.cnpj());
if(usedData.stream().anyMatch(companyValue -> !companyValue.getId().equals(company.getId())))
throw new UsedDataException();
company.setName(data.name());
company.setCnpj(data.cnpj());
company.setPassword(encoder.encode(data.password()));
companyRepository.save(company);
}
public Company getCompany(String companyId) {
return companyRepository.findById(UUID.fromString(companyId))
.orElseThrow(NullCompanyException::new);
}
}
O ponto é, quero mockar o resultado do método ´this.getCompany(token.getName())´ e devolver um ´mock(Company.class)´, mas não consigo fazer isso utilizando o ´when()´ por conta da referência ´this´, pesquisei algumas formas e maneiras de fazer isso mas ainda não consegui.
Grato se alguém puder me ajudar.