es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo escribir casos de prueba JUnit para createNativeQuery de EntityManager con parámetros String y clase.

@Repository
public class DesignatorDaoImpl extends GenericDaoImpl implements DesignatorDao {

    @Autowired
    EntityManager em;

    public List<designator> getDesignators(DesignatorRequestDTO dto) throws Exception {
        List<designator> designatorsList = new ArrayList<>();
        int start = dto.getStart();

        String queryString = "select * from ( SELECT * FROM TAB.DESIGNATOR WHERE ACTIVE_IND ='A' ORDER BY LAST_EDITED_DATE DESC ) OFFSET "+ start +" ROWS FETCH NEXT "+dto.getLimit()+" ROWS ONLY";            
        Query query = em.createNativeQuery(queryString,Designator.class);
        designatorsList = query.getResultList();
        return designatorsList;
    }
}

@Transactional
@Rollback(true)
public class DesignatorDaoImplTest {

    @Mock
    EntityManager entityManagerMock;

    @Mock
    TypedQuery<designator> getQuery;

    @InjectMocks
    DesignatorDaoImpl designatorDaoImpl;

    DesignatorRequestDTO dto = new DesignatorRequestDTO();

    List<designator> designatorEntityList = new ArrayList<>();

    @Before
    public void setUp() throws Exception { 
        MockitoAnnotations.initMocks(this);
        dto.setLimit(4);
        dto.setStart(1);

        Designator entity = new Designator();
        entity.setId("dgbkk");
        designatorEntityList.add(entity);
    }

    @Test
    public void saveDesignatorTest() throws Exception {
        Mockito.when(entityManagerMock.createNamedQuery(ArgumentMatchers.anyString(), ArgumentMatchers.eq(Designator.class))).thenReturn(getQuery);
        Mockito.when(getQuery.getResultList()).thenReturn(designatorEntityList);
        assertNotNull(designatorDaoImpl.saveDesignators(dto));
    }
}

“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Dado que el método em.createNativeQuery() es parte de la clase EntityManager que está siendo simulada en la clase de prueba, necesitamos especificar el comportamiento de este método en la clase de prueba usando el método Mockito.when(). Para simular adecuadamente el método em.createNativeQuery(), podemos modificar el método setUp() en la clase de prueba de la siguiente manera:

    @Before
    public void setUp() throws Exception { 
        MockitoAnnotations.initMocks(this);
        dto.setLimit(4);
        dto.setStart(1);
    
        Designator entity = new Designator();
        entity.setId("dgbkk");
        designatorEntityList.add(entity);
    
        // simular el comportamiento del método createNativeQuery
        Query queryMock = Mockito.mock(Query.class);
        Mockito.when(entityManagerMock.createNativeQuery(Mockito.anyString())).thenReturn(queryMock);
        Mockito.when(queryMock.getResultList()).thenReturn(designatorEntityList);
    }
    

    Creamos un objeto simulado de la clase Query y especificamos que el método entityManagerMock.createNativeQuery() debe devolver este objeto simulado cuando se llame con cualquier argumento de cadena. También especificamos que el método getQuery.getResultList() debe devolver la variable designatorEntityList.

    Alternativamente, también podemos utilizar el método PowerMockito.mockStatic() para simular el comportamiento del método createNativeQuery(). Aquí tienes un ejemplo de cómo hacerlo:

    @RunWith(PowerMockRunner.class)
    @PrepareForTest(DesignatorDaoImpl.class)
    public class DesignatorDaoImplTest {
    
        @Mock
        EntityManager entityManagerMock;
    
        // ...
    
        @Before
        public void setUp() throws Exception {
            // ...
    
            // simular el comportamiento del método createNativeQuery
            Query queryMock = Mockito.mock(Query.class);
            PowerMockito.mockStatic(DesignatorDaoImpl.class);
            PowerMockito.when(DesignatorDaoImpl.class, "createQuery", Mockito.anyString(), Mockito.any(), Mockito.any()).thenReturn(queryMock);
            Mockito.when(queryMock.getResultList()).thenReturn(designatorEntityList);
        }
    
        // ...
    }
    

    Este método utiliza el método PowerMockito.mockStatic() para simular el comportamiento del método createNativeQuery() en la clase DesignatorDaoImpl, pasando el nombre de la clase y la firma del método.

Comments are closed.