我们使用VC6编译器在C++中实现的非常古老的遗留系统.现在我们正在重构代码.我们还切换到了VC9编译器.
我们使用外部专有框架,这也是遗留代码,而不是单元可测试的.为了使我们的代码单元可测试,我们为框架类引入了接口和包装器(提示:请参阅Martin Fowler的"使用遗留代码"):

现在我们依赖于接口.包装器调用框架方法,我们可以愉快地在单元测试中使用模拟.
在这里,我们来解决我们的问题......
框架类包含许多需要包装和模拟的方法.为了实现这一目标,我们的供应商团队编写了一个API,它使用C++宏生成接口,包装器和模拟器实现.
包装头文件的示例:
class PlanWrapper : public IPlan
{
// ...
WRP_DECLARE_DEFAULTS(FrameworkPlan); // macro
WRP_DECLARE_CSTR_ATTR(FrameworkPlanLabel); // macro
// ...
};
Run Code Online (Sandbox Code Playgroud)
宏WRP_DECLARE_CSTR_ATTR的定义如下:
#define WRP_DECLARE_CSTR_ATTR(AttrName) \
virtual bool set##AttrName (LPCTSTR Value_in); \
virtual bool get##AttrName (CString& Value_out); \
virtual bool unset##AttrName (); \
virtual bool isSet##AttrName ()
Run Code Online (Sandbox Code Playgroud)
包装器cpp文件的示例:
#include "StdAfx.h"
using namespace SomeNamespace;
WRP_IMPLEMENT_MODDICOM_DEFAULTS(FrameworkPlan)
WRP_IMPLEMENT_W_CSTR_ATTR (FrameworkPlan,FrameworkType1, FrameworkPlanLabel)
// ...
Run Code Online (Sandbox Code Playgroud)
宏WRP_IMPLEMENT_W_CSTR_ATTR的定义如下:
#define WRP_IMPLEMENT_W_CSTR_ATTR(ClassName,AtrTypeObj,AttrName) \
bool ClassName##Wrapper::set##AttrName (LPCTSTR Value_in) { \
AtrTypeObj aValue = Value_in; \
FrameworkLink<ClassName> convertedObj …Run Code Online (Sandbox Code Playgroud) 我有一个DAO类的测试,我使用DBUnit来创建和填充数据库(使用内存中的德比).我在测试dao update方法时遇到问题,因为它修改数据然后另一个测试失败.因为我们所有人都知道测试应该独立于任何其他测试,并且我知道DBUnit在每次测试后都有一些清理和重新生成数据库的工具.但它不起作用!
代码就是这个(TestNG):
@BeforeMethod
public void prepareData() throws Exception {
cleanAndPopulate("users");
}
public void cleanAndPopulate (String nameXML) throws Exception {
IDatabaseConnection conn;
conn = new DatabaseConnection (sessionForTesting.connection());
InputStream is = DBconnection.class.getClassLoader()
.getResourceAsStream(nameXML + ".xml");
dataset = new FlatXmlDataSet(is);
System.out.println("*** Preparando base de datos de test");
DatabaseOperation.CLEAN_INSERT.execute(conn, dataset);
}
Run Code Online (Sandbox Code Playgroud)
这是测试(禁用以避免附带影响):
@Test(enabled=false) // Deja la BBDD en estado erroneo!!!
public void busco_y_actualizo() throws Exception {
PacoUser resultado = userdao.getById(1L);
resultado.setName("OTRO");
userdao.update(resultado);
PacoUser resultado2 = userdao.getById(1L);
AssertJUnit.assertNotNull(resultado2);
AssertJUnit.assertEquals("OTRO", resultado2.getName());
}
Run Code Online (Sandbox Code Playgroud)