mock class generator

本文介绍了一种通过C#代码自动生成符合特定接口的mock类的方法。该方法能够读取指定DLL文件中接口的所有方法,并为每个方法创建一个包含相应返回值和参数的mock实现。

根据接口的定义,自动生成符合这个接口的mock class。

class Program
    {
        
private static string assemblyFullName;
        
private static string interfaceName;
        
private static string outputFileName;

        
static void Main(string[] args)
        {
            assemblyFullName 
= @"C:\IGT_0803\development\dev_sbx_41\EGS\sb\lib\AnyCpu\debug\IGT.SB.PTN.Contracts.dll";
            interfaceName 
= "IGT.SB.PTN.Contracts.IPTNG2SHostServices";
            outputFileName 
= @"C:\Users\xingy\Desktop\mock.cs";

            StringBuilder totalContent 
= new StringBuilder();
            StringBuilder methodBody 
= new StringBuilder();
            StringBuilder extraMembers 
= new StringBuilder();
            Assembly ass 
= Assembly.LoadFrom(assemblyFullName);
            Type tt 
= ass.GetType(interfaceName);
            MethodInfo[] miArray 
= tt.GetMethods();

            
foreach (MethodInfo info in miArray)
            {
                methodBody.Clear();
                extraMembers.Clear();
                ParameterInfo returnParam 
= info.ReturnParameter;
                
bool isReturnVoid = returnParam.ParameterType.FullName.Equals("System.Void",
                                                                              StringComparison.
                                                                                  InvariantCultureIgnoreCase)
                                        
? true
                                        : 
false;

                methodBody.Append(
"public ");
                methodBody.Append(returnParam 
+ " ");
                methodBody.Append(info.Name).Append(
"(");

                
string nameOfIsCalled = "Is" + info.Name + "Called";
                extraMembers.Append(
"public bool ")
                    .Append(nameOfIsCalled)
                    .Append(
";")
                    .Append(Environment.NewLine);

                
if (!isReturnVoid)
                {
                    extraMembers.Append(
"public ")
                        .Append(returnParam.ParameterType)
                        .Append(
" ").Append(info.Name).Append("_actualReturnValue")
                        .Append(Environment.NewLine);
                }

                ParameterInfo[] paras 
= info.GetParameters();

                
foreach (ParameterInfo parameterInfo in paras)
                {
                    extraMembers.Append(
"public ")
                    .Append(parameterInfo.ParameterType.ToString()).Append(
" ")
                    .Append(parameterInfo.Name).Append(
"_actualValue")
                    .Append(
";")
                    .Append(Environment.NewLine);
                }

                totalContent.Append(extraMembers.ToString());

                
foreach (ParameterInfo parameterInfo in paras)
                {
                    methodBody.Append(parameterInfo.ParameterType.ToString())
                        .Append(
" ")
                        .Append(parameterInfo.Name);
                }

                methodBody.Append(
")").Append(Environment.NewLine);
                methodBody.Append(
"{").Append(Environment.NewLine);

                methodBody.Append(
"  ")
                    .Append(nameOfIsCalled)
                    .Append(
" = true;")
                    .Append(Environment.NewLine);

                methodBody.Append(Environment.NewLine);

                
foreach (ParameterInfo parameterInfo in paras)
                {
                    methodBody
                        .Append(
"  ")
                        .Append(parameterInfo.Name)
                        .Append(
"_actualValue")
                        .Append(
" = ")
                        .Append(parameterInfo.Name)
                        .Append(
";")
                        .Append(Environment.NewLine);
                }

                
if (!isReturnVoid)
                {
                    methodBody
                        .Append(
"  ")
                        .Append(
"return ")
                        .Append(info.Name).Append(
"_actualReturnValue")
                        .Append(
";")
                        .Append(Environment.NewLine);
                }

                methodBody.Append(
"}").Append(Environment.NewLine);

                totalContent.Append(methodBody.ToString()).Append(Environment.NewLine);

            }
            Console.WriteLine(totalContent);
            File.WriteAllText(outputFileName, totalContent.ToString());
            Console.Read();
        }

    }

转载于:https://www.cnblogs.com/xingyukun/archive/2011/03/14/1983855.html

class MockGeneratorExecute : public Generator { public: void do_on() { mock().actualCall("do_on"); } void do_ff() { mock().actualCall("do_ff"); } void do_SetPower(double power) { mock().actualCall("do_SetPower"); } void do_SetS2Power(double power) { mock().actualCall("do_SetS2Power"); } void do_SetMode(int mode) { mock().actualCall("do_SetMode"); } }; class MockGeneratorAbort : public Generator { public: void do_on() { throw AbortException("error"); } void do_off() { throw AbortException("error"); } void do_SetPower(double power) { throw AbortException("error"); } void do_SetS2Power(double power) { throw AbortException("error"); } void do_SetMode(int mode) { throw AbortException("error"); } }; class MockGeneratorException : public Generator { public: void do_on() { throw std::exception(); } void do_off() { throw std::exception(); } void do_SetPower(double power) { throw std::exception(); } void do_SetS2Power(double power) { throw std::exception(); } void do_SetMode(int mode) { throw std::exception(); } }; TEST_GROUP(GeneratorTest) { Generator* GeneratorExecute; Generator* GeneratorAbort; Generator* GeneratorException; void setup() { GeneratorExecute = new MockGeneratorExecute(); GeneratorAbort = new MockGeneratorAbort(); GeneratorException = new MockGeneratorException(); } void teardown() { mock().clear(); delete GeneratorExecute; delete GeneratorAbort; delete GeneratorException; /*ObjectManager::shutdown();*/ } }; // 1 TEST(GeneratorTest, SetModeService) { Generator::SetMode* rp = new Generator::SetMode(); rp->setOwner(GeneratorExecute); mock().expectOneCall("do_SetMode"); rp->execute(); } 指针rp会是空指针吗
08-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值