如何使用DB为方法创建jUnit测试用例



我从来没有做过jUnit测试用例。我寻找如何做,但我只是做了基本的测试用例与assertEquals()。我不知道如何做这个方法:

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");
}

}

我从DB检索一个对象。然后用DB数据填充PlanningObject类中的List。我不知道如何实现jUnit测试用例。我听说过mock?

mock是类似于dummy的东西。mock一个DB意味着通过一些Java对象来模拟它,而不是访问真实的DB(从而避免依赖)。在你的情况下,如果DummyApc7DAOFactory 将是一个接口(参见抽象工厂模式),那么你可以实现一个Junit版本的接口,它返回一个DummyApc7的实例,你可以测试的值(使用Junit框架的assert方法)。

要做到这一点,您必须相应地重新设计代码(并确保LogCvaultImport不会造成任何麻烦)。当涉及到单元测试时,应用程序代码中带有静态方法的类总是另一个需要避免的依赖源。

在适当的TDD(测试驱动开发)方法中,您将使用DummyApc7DAOFactory的单元测试友好实例来设置Apc7Engine,该实例在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可能会有所帮助。在这里,您不必模拟DB,而是存根DummyApc7DAOFactory类的方法调用。但是也有限制:Mockito不能存根final类或匿名类。如果是这种情况,您必须重新设计代码。如果没有,一个快速的解决方案可能如下所示:

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()); 
            //...
        }
}

相关内容

  • 没有找到相关文章

最新更新