Junit在EntityManager上引发NullPointerException

问题描述

我正在处理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);
}