近两天一有空就会去看看项目代码,思考一下如何利用cmockery对项目里已有的代码进行测试。项目代码中很多被调用的接口都带有输出参数,而且在这些接口中多利用返回值指示执行成败也否,而利用输出参数返回一些关键结果,这些结果值甚至影响着后续的函数执行流程。前期研究cmockery时没有注意到cmockery是否可以设置被mock接口的输出参数的值,不过回顾了一下cmockery实现的原理,觉得cmockery是应该可以支持的。遂重新翻看了一下cmockery的manual,发现在mock_query_database中确有对输出参数的mock调用,代码如下:
// Mock query database function.
unsigned int mock_query_database( DatabaseConnection* const connection,
const char * const query_string, void *** const results)
{
*results = (void**)mock();
return (unsigned int)mock();
}
void test_get_customer_id_by_name(void **state) {
DatabaseConnection connection = { “somedatabase.somewhere.com”, 12345678, mock_query_database };
int customer_ids = 543;
will_return(mock_query_database, &customer_ids);
will_return(mock_query_database, 1);
assert_int_equal(get_customer_id_by_name(&connection, “john doe”), 543);
}
...