java.lang.NullPointerException:无法在null对象上调用方法queryForList()

时间:2017-07-31 09:47:09

标签: java unit-testing grails spring-jdbc

我在Service类中有一个简单的getEmployeeList方法,它使用Spring JDBC查询数据库以获取员工列表。

class EmployeeListService
{

private static final String QUERY_FOR_GETTING_ALL_EMPLOYEE_LIST="select ID, name from emp order by name";

     def dataSource
      private JdbcTemplate jdbcTemplate

     @PostConstruct
     def init() {
           jdbcTemplate = new JdbcTemplate(dataSource)
     }


    def getEmployeeList()  {

        ArrayList<String> employeeList = jdbcTemplate.queryForList(QUERY_FOR_GETTING_ALL_EMPLOYEE_LIST);
        return employeeList;
    }
}

我正在为getEmployeeList方法的Null检查编写Grails单元测试。

    @WithGMock
class EmployeeListServiceTest  extends GrailsUnitTestCase {

    EmployeeListService empService;

    @Before
    public void setUp() {
        empService = new EmployeeListService();

    }

    @Test
    public void toCheckgetEmployeeListDoesNotReturnNull()
    {
        ArrayList<String> employeeList = empService.getEmployeeList()

        assertNotNull(employeeList);
    }
}

当我在正常流程中执行程序时,我得到了员工列表。但是当我执行单元测试时,我会遇到异常

 Failure:  toCheckgetEmployeeListDoesNotReturnNull(com.employee.home.service.EmployeeListServiceTest)

  java.lang.NullPointerException: Cannot invoke method queryForList() on null object
       at com.employee.home.service.EmployeeListService.getEmployeeList(EmployeeListService.groovy:170)
       at com.employee.home.service.EmployeeListServiceTest.toCheckgetEmployeeListDoesNotReturnNull(EmployeeListServiceTest.groovy:24)

1 个答案:

答案 0 :(得分:0)

在单元测试期间,您在setUp方法中手动创建服务实例时,不会调用postConstruct方法。

因此没有被召唤。

 @PostConstruct
     def init() {
           jdbcTemplate = new JdbcTemplate(dataSource)
     }

这导致您的JdbcTemplate在单元测试期间为空。

如果您需要测试数据库查询等,我建议您使用集成测试。