如何用String和class作为参数为EntityManger createNativeQuery编写Junit测试用


@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;
}
}

我有上面的类来从DB中获取记录。我为上面的这个类写了JUnit测试作为

@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));
}
}

我在嘲笑上有问题,在dao课堂上的这个em.createNativeQuery(queryString,Designator.class),我得到了null。如何在测试课中正确地模拟em.createNativeQuery

根据文档,如果使用参数匹配器,则所有参数都必须由匹配器提供。因此,请尝试使用ArgumentMatchers.eq()(参考文档(检查Designator.class是否相等:

@Mock
TypedQuery<Designator> getQuery;
@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.getDesignators(dto));
}

避免使用属性注入,而是使用构造函数注入:

@Repository
public class DesignatorDaoImpl extends GenericDaoImpl implements DesignatorDao {
private EntityManager em;
public DesignatorDaoImpl(EntityManager em) {
super();
this.em = 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;
}
}

然后,您需要删除@InjectMocks,因为您在初始化之前正在注入它们,并创建DesignatorDaoImpl的实例以在@Before方法中进行测试:

@Transactional
@Rollback(true)
public class DesignatorDaoImplTest {
@Mock
EntityManager entityManagerMock;
@Mock
TypedQuery<Designator> getQuery;
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);
designatorDaoImpl = new DesignatorDaoImpl(entityManagerMock);
}
@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));
}
}

如果不能更改DesignatorDaoImpl,则使用@RunWith(MockitoJUnitRunner.class)而不是MockitoAnnotations.initMocks(this);,如下所示:

@Transactional
@Rollback(true)
@RunWith(MockitoJUnitRunner.class)
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));
}
}

最新更新