Программисты JAVA общаются здесь
-
Anonymous
Почему при высмеивании предиката возвращается нулевой указатель?
Сообщение
Anonymous »
Мой предикат возвращает нулевой указатель при выполнении.
Мой тестовый код:
Код: Выделить всё
public class CompanyRepositoryTest {
@Mock
private EntityManager entityManager;
@Mock
private CriteriaBuilder criteriaBuilder;
@Mock
private CriteriaQuery criteriaQuery;
@Mock
private Root root;
@Mock
private TypedQuery typedQuery;
@Mock
private Path path;
@Mock
private Expression express;
@InjectMocks
private CompanyRepositoryImpl companyRepository;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
@DisplayName("Should find Company by CNPJ and return success")
void findByCnpjSuccess() {
String cnpj = "123456789";
Company company = new Company();
company.setCnpj(cnpj);
List companies = new ArrayList();
companies.add(company);
when(entityManager.getCriteriaBuilder()).thenReturn(criteriaBuilder);
when(criteriaBuilder.createQuery(Company.class)).thenReturn(criteriaQuery);
when(criteriaQuery.from(Company.class)).thenReturn(root);
when(root.get("cnpj")).thenReturn(path);
Predicate predicate = mock(Predicate.class);
when(criteriaBuilder.and(any())).thenReturn(predicate);
when(criteriaBuilder.equal(path, cnpj)).thenReturn(predicate);
// Criando o Predicate corretamente
// Predicate predicate = criteriaBuilder.equal(root.get("cnpj"), cnpj);
// Configurando o mock para retornar o Predicate criado
// when(criteriaBuilder.equal(root.get("cnpj"), cnpj)).thenReturn(predicate);
when(entityManager.createQuery(criteriaQuery)).thenReturn(typedQuery);
when(typedQuery.getResultList()).thenReturn(companies);
List result = companyRepository.findByCnpj(cnpj);
assertEquals(1, result.size());
assertEquals(cnpj, result.get(0).getCnpj());
verify(entityManager).getCriteriaBuilder();
verify(criteriaBuilder).createQuery(Company.class);
verify(criteriaQuery).from(Company.class);
verify(criteriaBuilder).equal(root.get("cnpj"), cnpj);
verify(entityManager).createQuery(criteriaQuery);
verify(typedQuery).getResultList();
}
}
И мой метод проверен
Код: Выделить всё
@Autowired
private EntityManager manager;
@Override
public List findByCnpj(String cnpj) {
CriteriaBuilder builder = manager.getCriteriaBuilder();
CriteriaQuery query = builder.createQuery(Company.class);
Root root = query.from(Company.class);
Predicate predicate = builder.and(builder.equal(root.get("cnpj"), cnpj));
query.select(root).where(predicate);
TypedQuery typedQuery = manager.createQuery(query);
return typedQuery.getResultList();
}
Я пытаюсь выполнить тест с помощью Mockito.
Подробнее здесь:
https://stackoverflow.com/questions/784 ... ll-pointer
1714837313
Anonymous
Мой предикат возвращает нулевой указатель при выполнении.
Мой тестовый код:
[code]public class CompanyRepositoryTest {
@Mock
private EntityManager entityManager;
@Mock
private CriteriaBuilder criteriaBuilder;
@Mock
private CriteriaQuery criteriaQuery;
@Mock
private Root root;
@Mock
private TypedQuery typedQuery;
@Mock
private Path path;
@Mock
private Expression express;
@InjectMocks
private CompanyRepositoryImpl companyRepository;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
@DisplayName("Should find Company by CNPJ and return success")
void findByCnpjSuccess() {
String cnpj = "123456789";
Company company = new Company();
company.setCnpj(cnpj);
List companies = new ArrayList();
companies.add(company);
when(entityManager.getCriteriaBuilder()).thenReturn(criteriaBuilder);
when(criteriaBuilder.createQuery(Company.class)).thenReturn(criteriaQuery);
when(criteriaQuery.from(Company.class)).thenReturn(root);
when(root.get("cnpj")).thenReturn(path);
Predicate predicate = mock(Predicate.class);
when(criteriaBuilder.and(any())).thenReturn(predicate);
when(criteriaBuilder.equal(path, cnpj)).thenReturn(predicate);
// Criando o Predicate corretamente
// Predicate predicate = criteriaBuilder.equal(root.get("cnpj"), cnpj);
// Configurando o mock para retornar o Predicate criado
// when(criteriaBuilder.equal(root.get("cnpj"), cnpj)).thenReturn(predicate);
when(entityManager.createQuery(criteriaQuery)).thenReturn(typedQuery);
when(typedQuery.getResultList()).thenReturn(companies);
List result = companyRepository.findByCnpj(cnpj);
assertEquals(1, result.size());
assertEquals(cnpj, result.get(0).getCnpj());
verify(entityManager).getCriteriaBuilder();
verify(criteriaBuilder).createQuery(Company.class);
verify(criteriaQuery).from(Company.class);
verify(criteriaBuilder).equal(root.get("cnpj"), cnpj);
verify(entityManager).createQuery(criteriaQuery);
verify(typedQuery).getResultList();
}
}
[/code]
И мой метод проверен
[code]@Autowired
private EntityManager manager;
@Override
public List findByCnpj(String cnpj) {
CriteriaBuilder builder = manager.getCriteriaBuilder();
CriteriaQuery query = builder.createQuery(Company.class);
Root root = query.from(Company.class);
Predicate predicate = builder.and(builder.equal(root.get("cnpj"), cnpj));
query.select(root).where(predicate);
TypedQuery typedQuery = manager.createQuery(query);
return typedQuery.getResultList();
}
[/code]
Я пытаюсь выполнить тест с помощью Mockito.
Подробнее здесь: [url]https://stackoverflow.com/questions/78429399/why-when-mocked-predicate-return-null-pointer[/url]