我从来没有做过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());
//...
}
}