gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:54:34 27 4
gpt4 key购买 nike

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

}

我从数据库中检索一个对象。然后,我使用数据库数据填充 PlanningObject 类中的列表。我不知道如何实现 jUnit 测试用例。我听说过模拟?

谢谢大家!

最佳答案

模拟是类似于虚拟对象的东西。模拟数据库意味着通过一些 Java 对象来模拟它,而不是访问真实的数据库(从而避免依赖)。在您的情况下,如果 DummyApc7DAOFactory 是一个接口(interface)(请参阅抽象工厂模式),那么您可以实现该接口(interface)的 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 可能会有所帮助。在这里,您不必模拟数据库,而是 stub DummyApc7DAOFactory类的方法调用。但也有一些限制:Mockito 无法 stub 最终类或匿名类。如果是这种情况,则必须重新设计代码。如果没有,一个快速而肮脏的解决方案可能如下所示:

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

关于java - 如何使用 DB 为方法创建 jUnit 测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32838017/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com