问题描述
我正在处理Junit Test
个案件,这些案件引发了NullPointerException
,这是我的Junit测试类结构
@RunWith(SpringJUnit4ClassRunner.class)
public class EmployeeTest {
@InjectMocks
EmployeeRepository empRepo;
@InjectMocks
EmployeeService empService;
@Mock
EntityManager entityManager;
List<Employee> empList=new ArrayList<Employee>();
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void getEmployyeList(){
Employee e = new Employee(111,'Raunak','kumar','Hero Inc');
List<Employee> empList=empService.getAllEmployee();
Employee e1 = empList.stream().filter(emp->emp.getEmpId()==111).findAny().get();
assertEquals(e,e1);
}
}
在EmployeeService
上,我正在使用EntityManager
public class EmployeeService{
@Autowired
EntityManager em;
public List<Employee> getAllEmployee(){
return em.createNativeQuery("select e.* from employee e").getResultList();
}
}
当我debugging
时,代码发现em.createNativeQuery("select e.* from employee e")
返回null。从Rest API
开始,一切正常。
尝试
when(empRepo.findAll()).thenReturn(empList);
assertthat(users,containsInAnyOrder(
hasProperty("lastName",is("Kumar"))
));
但是empRepo.findAll()
也返回[]
解决方法
您必须使用mockito的时间对模拟实体管理器进行存根,然后返回测试用例(getEmployyeList),如下所示,这应该可以解决NPE
@Test
public void getEmployyeList(){
Employee e = new Employee(111,'Raunak','kumar','Hero Inc');
Query query = mock(Query.class);
when(entityManager.createNativeQuery(anyString())).thenReturn(query);
doReturn(Arrays.asList(e)).when(query).getResultList();
List<Employee> empList=empService.getAllEmployee();
Employee e1 = empList.stream().filter(emp->emp.getEmpId()==111).findAny().get();
assertEquals(e,e1);
}