2013-03-13 4 views
1

Я пытаюсь выполнить тестирование моего класса и издеваться над DAO для обеспечения прогнозируемых результатов. Тем не менее, похоже, что мой метод DAO все еще называется, поскольку я получаю ошибку спящего режима.unit testing mock injection

org.hibernate.exception.GenericJDBCException: Station TST не найден.

Эта ошибка является результатом того, что моя база данных не содержит TST, но разве это нельзя даже назвать, поскольку я издевался над DAO? Как я высмеиваю вызов, чтобы база данных даже не попала.

Вот как настроить мой макет

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:applicationContext.xml" }) 
public class MyServiceTest{ 

    @Autowired 
    private MyService service; 

    private MyDAO dao; 

    private LinkedList objs;  


    @Before 
    public void init() throws SecurityException, NoSuchFieldException, 
      IllegalArgumentException, IllegalAccessException { 


     // mock the dao for predictable results 
     dao = mock(MyDAO.class); 

     when(dao.myDBCall(anyString(), any(Date.class))).thenReturn(legs); 
     Field f = MyService.class.getDeclaredField("dao"); 
     f.setAccessible(true); 
     f.set(service, dao); 


    } 

    @Test 
    public void testCall() { 
     // construct our sample leg data 
     legs = new LinkedList(); 
//fill in my stub data i want to return 

     Collections.shuffle(legs); 

     List results = service.testingCall("TST", new Date()); // this fails because service is using the dao, but it is making a call to the DB with this garbage 'Test' param rather than just returning 'legs' as stated in my when clause 
     assertThat(results, not(nullValue())); 


    } 

    @Test 
    public void testGetGates() { 
     // fail("Not yet implemented"); 
    } 

    @Test 
    public void testGetStations() { 
     // fail("Not yet implemented"); 
    } 
} 

ответ

1

Для первых, вместо Field f = MyService.class.getDeclaredField("dao"); проверки на PowerMock (проверьте Whitebox)

Дразнящий один объект не будет препятствовать спящий режим запуска (потому что вы загружаются applicationContext.xml, поэтому hibernate попытается подключиться к БД). Ваш макет - это всего лишь POJO в одном поле одного тестового экземпляра, а не в виде весны или замены для класса.

Если вы хотите протестировать только классы dao и service (создать ясный модульный тест) - удалите аннотации Spring, связанные с тестом, и сделайте это самостоятельно (создайте mock, создайте сервис, установите mock для обслуживания и проверьте его).

Если вы хотите протестировать свое приложение с помощью контекста Spring (создать интеграционный тест), создайте H2 in-memory database для hibernate и просто проверьте свои услуги (не забудьте очистить его в @After).

Третий способ - разделить файл конфигурации на двух профилей Spring (например dev и test) и реализовать издеваться себя (поместить макет в test, реальный спящем и дао в dev).

Если вы не хотите использовать пружинные профили - можно разделить applicationContext.xml на 3 файла (для обычных бобы, для реальных бобин БД, для издевок).

И еще один сексуальный способ - использовать springockito-annotations (но вам все еще нужно, чтобы избежать зимуют быть загружен)

+0

H2, к сожалению, не вариант. Что касается «делать это сам по себе», то в моем сервисе есть много других компонентов, которые мне нужно сделать AutoInjected, что делает этот подход непрактичным. Неужели невозможно полностью издеваться над дао? – 75inchpianist

+0

Вы можете. Во-первых, переместите конфигурацию xml, связанную с гибернацией, на некоторый («dev») профиль Spring (google для «профилей весны»). Затем создайте свою незавершенную реализацию dao и поместите ее в профиль «test». После добавления аннотации @ActiveProfiles («test») к тесту (вам также необходимо активировать профиль «dev» при запуске обычного приложения). Если вам не нравятся профили - разделить конфигурацию в 3 файла (applicationContext.xml, dev.xml, mock.xml) –

+0

А также проверить - https://bitbucket.org/kubek2k/springockito/wiki/Home –

2

Я думаю, что ваш Service инстанциируется весной с Dao определены в вашем application-context.xml и Вы получите сообщение об ошибке, прежде чем даже пытаться внедрить свой макет в службе ,

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

private MyDao myDao; 

@Autowired 
public MyService(MyDao myDao){ 
this.myDao = myDao; 
} 

А потом в тесте:

MyService myService = new Myservice(mockedDao); 
+0

ошибка, конечно, приходит после того, как я впрыснуть мою издеваться. я могу сказать, перейдя через отладчик – 75inchpianist

+0

Есть ли в вашей службе другие дао? – benzonico

+0

нет только одного, но он содержит другие бобы Мне нужен AutoInjected – 75inchpianist