2016-01-22 5 views
0

Я пытаюсь высмеять класс dao, но я не могу издеваться над dao-классом, он выбрасывает исключение null-указателя (в классе dao я использую шаблон Spring jdbc). Я устал издеваться над шаблоном jdbc, но при этом он возвращает шаблон jdbc как null.Шаблон Jdbc Mocking In java

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ LocationAppDAO.class, BeanPropertyRowMapper.class }) 
public class CopyOfGeoLocationAppTest { 
    @Autowired 
    private ApplicationContext applicationContext; 

    @Test 
    @SuppressWarnings({ "unchecked" }) 
    public void testJdbcTemplateforDbase() throws Exception { 
     // LocationAppDAO locationAppdao= new LocationAppDAO(); 
     String queryWgs84 = "SELECT * FROM location_wgs84 where latitude=" + 0 
       + " AND longitude=" + 0; 
     LocationAppDAO locationAppDaoMock= EasyMock.createMock(LocationAppDAO.class); 
     JdbcTemplate jdbcTemplateMock = EasyMock.createMock(JdbcTemplate.class); 
     BeanPropertyRowMapper<Location_wgs84> beanPropertyRowMapperMock = EasyMock 
       .createMock(BeanPropertyRowMapper.class); 

     EasyMock.replay(beanPropertyRowMapperMock); 
     // mocking location 
     Location_wgs84 location_wgs84mock = EasyMock 
       .createMock(Location_wgs84.class); 
     location_wgs84mock.setLatitude(0); 
     location_wgs84mock.setLongitude(0); 
     EasyMock.replay(location_wgs84mock); 
     PowerMock.expectNew(BeanPropertyRowMapper.class).andReturn(
       beanPropertyRowMapperMock); 
     PowerMock.replayAll(); 
     ArrayList<Location_wgs84> arrayList = new ArrayList<Location_wgs84>(); 
     Location_wgs84 location1 = new Location_wgs84(); 
     location1.setLatitude(1); 
     location1.setLongitude(1); 
     arrayList.add(location1); 
     Location_wgs84 location2 = new Location_wgs84(); 
     location2.setLatitude(2); 
     location2.setLongitude(2); 
     arrayList.add(location2); 
     Location_wgs84 location3 = new Location_wgs84(); 
     location3.setLatitude(3); 
     location3.setLongitude(3); 
     arrayList.add(location3); 
     EasyMock.expect(
       jdbcTemplateMock.query(queryWgs84, beanPropertyRowMapperMock)) 
       .andStubAnswer(new IAnswer<List<Location_wgs84>>() { 
        @Override 
        public List<Location_wgs84> answer() throws Throwable { 
         return arrayList; 
        }; 
       }); 
     EasyMock.replay(jdbcTemplateMock); 
     EasyMock.expect(
       locationAppDaoMock.location_wgs84Query(0,0)) 
       .andStubAnswer(new IAnswer<List<Location_wgs84>>() { 
        @Override 
        public List<Location_wgs84> answer() throws Throwable { 
         return arrayList; 
        }; 
       }); 
     EasyMock.replay(locationAppDaoMock); 
     LocationAppDAO locationAppdao= new LocationAppDAO(); 
     ReflectionTestUtils.setField(locationAppdao, "jdbcTemplate", jdbcTemplateMock); 
     List<Location_wgs84> arrayListResult = locationAppdao.location_wgs84Query(0, 0); 
     assertEquals(3.0, arrayListResult.get(2).getLatitude(), 0); 
     EasyMock.verify(jdbcTemplateMock); 
    } 
} 
+0

Как насчет предоставления источника данных, который возвращает данные, которые вам нужны? – Marged

ответ

0

Вместо использования насмешливых библиотек, я часто использую H2 database. Я создал базу данных с памятью с DDL, которая позволяет мне проверить, что мое приложение вносит правильные изменения в базовые таблицы и/или хранимые процедуры, без необходимости блокировать мои тесты до специфики библиотеки доступа к базе данных.

Все, что вам нужно сделать, это предоставить строку соединения при выполнении тестов, аналогичную приведенной ниже. Он создаст базу данных и запустит DDL в любое время, когда будет установлено соединение.

jdbc:h2:mem:example_database;INIT=RUNSCRIPT FROM 'classpath:db/my-example-database.ddl'