There is an interface IF_CRM_PRODUCT_PROXY in CRM which declares almost all function modules from function group COM_PRODUCT_API for product master access.
![](https://img.haomeiwen.com/i2085791/f7fdc18fbbcba8a7.png)
This interface is implemented by three classes below.
![](https://img.haomeiwen.com/i2085791/d94dbf20371a0ff7.png)
CL_CRM_PRODUCT_PROXY will delegate the call to MOCK_PROXY( for unit test ) or REAL_PROXY( for productive use ) according to different mode in which the code is running. As an application developer, we do not directly call CL_CRM_PRODUCT_PROXY in our application code, but use another wrapper class CL_CRM_PRODUCT_API instead.
For example, I would like to get the product guid for product with id “I042416”, I use the following source code:
![](https://img.haomeiwen.com/i2085791/d4199b7f4976fac7.png)
In productive use scenario, the callstack could be found below:
our test report calls CL_CRM_PRODUCT_API, which calls CL_CRM_PRODUCT_PROXY, which then calls the productive implementation – CL_CRM_PRODUCT_REAL_PROXY. Inside the real proxy, function module COM_PRODUCT_GUID_GET is called.
![](https://img.haomeiwen.com/i2085791/c378b13db845b741.png)
How to use CRM mock framework to make fake product guid is returned
Suppose in my unit test code, I would like a fake guid “AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA” is returned by the same source code.
- Just add the following source code to let CL_CRM_PRODUCT_PROXY know that currently the code is running under mock mode.
cl_factory_proxy=>set_source( iv_source = 'MOCK'
iv_xml_master_data_file = '\\TSHomeServer\TSHome$\i042416\Desktop\test.xml'
iv_read_from_mime = abap_false ).
This code would probably be inserted into the class_setup of your unit test code.
![](https://img.haomeiwen.com/i2085791/6eefe707a7bf13aa.png)
- paste the following source code into your test.xml:
<Mock XMLCompressVersion="2">
<XMLRC_Object ObjectName="CL_CRM_PRODUCT_API" Component="COM_PRODUCT_GUID_GET" input="8B70F13430313231340300">
<EV_PRODUCT_GUID>qqqqqqqqqqqqqqqqqqqqqg==</EV_PRODUCT_GUID></XMLRC_Object></Mock>
![](https://img.haomeiwen.com/i2085791/8895b770d5839a89.png)
- Where does input 8B70F13430313231340300 in xml come from?
Set a breakpoint on function module PROXY_CONVERT_TO_STRING,
![](https://img.haomeiwen.com/i2085791/99bdd90b93fe3a0c.png)
![](https://img.haomeiwen.com/i2085791/4cebdcd31eb6d6bd.png)
and you can know this value is calculated based on the zip operation of the concatenated value based on all input parameter values ( in my example, it is CDI042416 )
- Where does qqqqqqqqqqqqqqqqqqqqqg== for IV_PRODUCT_GUID in xml come from?
Execute function module SSFC_BASE64_ENCODE in test mode, paste the fake guid AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA and execute it, then you get base64 encoded value. Paste the value into xml file.
![](https://img.haomeiwen.com/i2085791/44365228f521640e.png)
- Now execute the test report once again. From callstack you can see that the MOCK_PROXY is called, the faked guid is fetched from XML and returned:
![](https://img.haomeiwen.com/i2085791/08992b952804edfb.png)
![](https://img.haomeiwen.com/i2085791/210f4aaf5f43c6c3.png)
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
![](https://img.haomeiwen.com/i2085791/fc7ecd97deb67090.png)
网友评论