具有动态属性的UnitTest

2020-09-16 17:55发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨。 我正在编写单元测试。 我需要用双精度填充AbstractOrderModel discountValue。 但是事实证明,DiscountValue是动态属性,因此我的测试无法正常工作。

也许您知道如何解决此问题?

  @Accessor(qualifier =" discountValues",类型= Accessor.Type.SETTER)
      公共无效setDiscountValues(最终列表值)
      {
          getPersistenceContext()。setDynamicValue(this,DISCOUNTVALUES,value);
      }

  

我应该使用集成测试吗? 或者也许用spring config导入文件到我的单元测试中?

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨。 我正在编写单元测试。 我需要用双精度填充AbstractOrderModel discountValue。 但是事实证明,DiscountValue是动态属性,因此我的测试无法正常工作。

也许您知道如何解决此问题?

  @Accessor(qualifier =" discountValues",类型= Accessor.Type.SETTER)
      公共无效setDiscountValues(最终列表值)
      {
          getPersistenceContext()。setDynamicValue(this,DISCOUNTVALUES,value);
      }

  

我应该使用集成测试吗? 或者也许用spring config导入文件到我的单元测试中?

付费偷看设置
发送
2条回答
大圣 - sap领域执行人,9年sap运营经验
1楼 · 2020-09-16 18:22.采纳回答

我们使用以下代码片段创建可单元测试的模型实例

 类AbstractModelBuilder  {


  受保护的Map 处理程序=新的HashMap <>();
  受保护的Class  clazz;

 //很多withXXX方法
 
  公共T buildInstance(){
          尝试{
              Map  attributeValues = new HashMap <>();
              ItemContextBuilder mockContextBuilder = ItemContextBuilder.createMockContextBuilder(clazz,getRandomPK(),new Locale(" de"),attributeValues);
              如果(handlers.size()> 0){
                  mockContextBuilder.setDynamicAttributesProvider(new DefaultDynamicAttributesProvider(handlers));
              }
              ItemModelInternalContext ctx = mockContextBuilder.build();
              T实例= clazz.getConstructor(ItemModelContext.class).newInstance(ctx);
              updateInstanceWithSpecifiedProperties(instance);
              返回实例;
          } catch(Exception e){
              抛出新的RuntimeException("无法创建类型为+ + ClassUtils.getShortClassName(clazz),e)的实例;
          }
      }

  受保护的void addHandler(String property,DynamicAttributeHandler handler){
      handlers.put(属性,处理程序);
  }

  protected void updateInstanceWithSpecifiedProperties(T instance){
     //一些反射魔术来将值设置到模型中
  }
  }


  

在此处填充处理程序的位置(在此示例中为Product的" europe1Prices"属性)

  addHandler(" europe1Prices",新的DynamicAttributeHandler ,ProductModel>(){
          Collection  priceRowModels;

          @Override
          公共Collection  get(ProductModel productModel){
              return priceRowModels;
          }

          @Override
          公共无效集(ProductModel productModel,Collection  priceRowModels){
              this.priceRowModels = priceRowModels;
          }
      });


  

这使我们能够在单元测试中使用真实模型,这比使用模拟要方便得多。 本地化属性也可以正常工作

hengyuye
2楼-- · 2020-09-16 18:05

嗨,

您应该使用Mockito。 例如,可以在 AbstractOrderPopulatorTest 中找到示例。

 最终DiscountValue discountValue =模拟(DiscountValue.class);
  给定(abstractOrderEntryModel.getDiscountValues())。willReturn(Collections.singletonList(discountValue));
  给定(Double.valueOf(discountValue.getAppliedValue()))。willReturn(Double.valueOf(2.3));


  

一周热门 更多>