2015-09-29 3 views
1

Я никогда не делал тестовые примеры jUnit. Я искал, как это сделать, но я только что сделал основные тестовые примеры с assertEquals(). я не знаю, как это сделать для этого метода:Как создать тестовые примеры jUnit для метода с использованием DB

public class Apc7Engine extends BaseEngine { 

/** 
* This method retrieve plannings 
* in APC7 configuration 
* 
* It is an implementation of an abstract method 
* from BaseEngine.java 
* 
*/ 
@Override 
public void retrievePlannings() { 
    LogCvaultImport.code(200).debug("A7: start retrievePlannings"); 
    try { 
     List importList = DummyApc7DAOFactory.getDAO().getDummyApc7(); 
     Iterator poIterator = importList.iterator(); 

     while(poIterator.hasNext()) { 
      DummyApc7 dummy = (DummyApc7) poIterator.next(); 
      PlanningObject planning = new PlanningObject(); 
      planning.setAchievedDate(dummy.getLastUpdate()); 
      planning.setAircraftType(dummy.getAcType()); 
      planning.setBaselineDate(dummy.getLastUpdate()); 
      planning.setDeliverySite(dummy.getDeliverySite()); 
      planning.setEventId(dummy.getEvtId()); 
      planning.setEventName(dummy.getEvent()); 
      planning.setEventStatus(dummy.getEvtStatus()); 
      planning.setLastUpdate(dummy.getLastUpdate()); 
      planning.setModel(dummy.getModel()); 
      planning.setMsn(dummy.getMsn()); 
      planning.setOperator(dummy.getOperator()); 
      planning.setOwner(dummy.getOwner()); 
      planning.setProgram(dummy.getProg()); 
      planning.setSerial(dummy.getSerial()); 
      planning.setTargetDate(dummy.getLastUpdate()); 
      planning.setVersion(dummy.getVersion()); 
      planning.setVersionRank(dummy.getVersionRank()); 
      LogCvaultImport.code(800).info("A7|Event name: "+planning.getEventName()+" - MSN: "+planning.getMsn()+" - Delivery site: "+planning.getDeliverySite()); 
      listPlanningObject.add(planning);   
     } 
    } catch (DAOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    LogCvaultImport.code(1000).debug("A7: end retrievePlannings"); 
} 

}

я получить объект из БД. Затем я заполняю список из класса PlanningObject данными БД. Я не знаю, как реализовать jUnit тестовые примеры. Я слышал о насмешливости?

Спасибо, ребята!

+0

Вы должны взглянуть на Mockito. Популярная структура для создания тестов JUnit. вы найдете множество примеров. http://mockito.org/ – Fundhor

+0

Спасибо, мужчина, я смотрю его :) Кажется, это действительно полезно! – Majestic

ответ

1

Макет - это что-то вроде манекена. Чтобы издеваться над БД, это означало бы имитировать некоторый объект Java вместо доступа к реальной БД (таким образом, избегая зависимостей). В вашем случае, если DummyApc7DAOFactoryбудет интерфейсом (см. Шаблон абстрактной фабрики), тогда вы можете реализовать версию интерфейса Junit, которая возвращает экземпляр DummyApc7 со значениями, которые вы можете проверить (используя методы assert для структуры JUnit) ,

Для этого вам необходимо изменить ваш код соответственно (и убедитесь, что LogCvaultImport не вызывает никаких проблем). Классы со статическими методами в вашем коде приложения всегда являются еще одним источником зависимостей, которые вы бы хотели избежать, когда дело доходит до модульного тестирования.

В правильных TDD (Test Driven развитие) подхода вы создали Apc7Engine с блоком тестированием дружественного экземпляра DummyApc7DAOFactory, который делает вызов в retrievePlannings() как этот dummyApc7DAOFactory.getDAO().getDummyApc7(); (обратите внимание, что это не абстрактный вызов метода, больше) , Дополнительный код будет выглядеть следующим образом:

//AbstractDummyApc7DAOFactory.java 
public class AbstractDummyApc7DAOFactory { 
    /** @param real true, for real DAOFactory, false for Junit testing*/ 
    public static DummyApc7DAOFactory create(boolean real) { 
     if (real) { 
      //create and return the real DAOFactory object 
     } 
     else { 
      //return dummy implementation for Junit testing, better define in separate class 
      return new DummyApc7DAOFactory() { 
       public DummyApc7DAO getDAO() { 
        return new DummyApc7DAO() { 
         public List getDummyApc7() { 
          List dummyList = new ArrayList(); 
          testApc7 = new DummyApc7(); 
          testApc7.setVersion("1.Unit.Test"); 
          //.... 
          dummyList.add(testApc7); 
          return dummyList; 
         } 
        }; 
       } 
      }; 
     } 
    } 
} 

//test code in junit test class 
@Test 
public void testRetrievePlannings() { 
    DummyApc7DAOFactory fac = AbstractDummyApc7DAOFactory.create(false); 
    testObj.setDummyApc7DAOFactory(fac); 
    testObj.retrievePlannings(); 
    PlanningObject testPO = test.getListPlanningObject().get(0); 
    assertEquals(testApc7.getVersion(), testPO.getVersion()); 
    //... 
} 

Если редизайн кода не вариант, Mockito может помочь. Здесь вам не нужно mock DB, но заглушка mehod call вашего DummyApc7DAOFactory класс. Однако есть ограничения: Mockito не может заглушить финальные или анонимные классы. Если это так, вам нужно переконфигурировать код. Если нет, быстрое и грязное решение может выглядеть так:

public class RetrievePlanningsTest {  
     private DummyApc7 testApc7; 
     private Apc7Engine testObj = new Apc7Engine(); 

     @Before 
     public void setUp() { 
      DummyApc7DAOFactory mockedObj = mock(DummyApc7DAOFactory.class); 
      List dummyList = new ArrayList(); 
      testApc7 = new DummyApc7(); 
      testApc7.setVersion("1.Unit.Test"); 
      //.... 
      dummyList.add(testApc7); 
      when(DummyApc7DAOFactory.getDAO().getDummyApc7()).thenReturn(dummyList); 
     } 

     @Test 
     public void testRetrievePlannings() { 
      testObj.retrievePlannings(); 
      PlanningObject testPO = testObj.getListPlanningObject().get(0); 
      assertEquals(testApc7.getVersion(), testPO.getVersion()); 
      //... 
     } 
} 
+0

Спасибо! Я посмотрю на это. Я вернусь с тестовыми случаями :) – Majestic

+0

@Majestic Я добавил эскизы TDD-стиля и решения Mockito. –

+0

Удивительно, что вы мне показываете! Спасибо большое! : D Я не понял, что означает, что ваша переменная называется «test» там: '** test **. GetListPlanningObject(). Get (0);'. – Majestic

Смежные вопросы