为什么当模拟谓词时,返回空指针?

问题描述 投票:0回答:1

我的谓词执行时返回空指针。

我的测试代码:

public class CompanyRepositoryTest {

    @Mock
    private EntityManager entityManager;

    @Mock
    private CriteriaBuilder criteriaBuilder;

    @Mock
    private CriteriaQuery<Company> criteriaQuery;

    @Mock
    private Root<Company> root;

    @Mock
    private TypedQuery<Company> typedQuery;
    
    @Mock
    private Path<Object> path;
    
    @Mock
    private Expression<Object> 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<Company> 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<Company> 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<Company> findByCnpj(String cnpj) {
    CriteriaBuilder builder = manager.getCriteriaBuilder();
    CriteriaQuery<Company> query = builder.createQuery(Company.class);
    Root<Company> root = query.from(Company.class);
    
    Predicate predicate = builder.and(builder.equal(root.get("cnpj"), cnpj));
    query.select(root).where(predicate);
    
    TypedQuery<Company> typedQuery = manager.createQuery(query);
    return typedQuery.getResultList();
}

我正在尝试使用 Mockito 执行测试。

java spring-data-jpa mockito spring-test springmockito
1个回答
0
投票

快速运行一下代码,我发现“query.select(root)”没有被模拟。你可以试试这个:

when(criteriaQuery.select(root)).thenReturn(criteriaQuery);
© www.soinside.com 2019 - 2024. All rights reserved.