@Before
  public void setUp() throws Exception {
    authorizationManager = mocker.registerMockComponent(ContextualAuthorizationManager.class);

    BeanDescriptor mockBeanDescriptor = mock(BeanDescriptor.class);
    when(mockBeanDescriptor.getProperties()).thenReturn(Collections.EMPTY_LIST);

    BeanManager beanManager = mocker.getInstance(BeanManager.class);
    when(beanManager.getBeanDescriptor(any(Class.class))).thenReturn(mockBeanDescriptor);

    Macro velocityMacro = mocker.getComponentUnderTest();
    MacroManager mockMacroManager = mocker.registerMockComponent(MacroManager.class);
    when(mockMacroManager.getMacro(any(MacroId.class))).thenReturn(velocityMacro);
  }
  /**
   * Populate the provided bean with provided values.
   *
   * <p><code>values</code> is "consumed": when method executing is finished it only contains not
   * populated properties.
   *
   * @param bean the java bean to populate
   * @param values the values to convert and inject in the java bean
   * @throws PropertyException error when populating the bean
   */
  private void populateBean(Object bean, Map<String, Object> values) throws PropertyException {
    BeanDescriptor beanDescriptor = getBeanDescriptor(bean.getClass());

    // Lower case provided properties to easily ignore properties name case
    Map<String, String> lowerKeyMap = new HashMap<String, String>(values.size());
    for (Map.Entry<String, ?> entry : values.entrySet()) {
      lowerKeyMap.put(entry.getKey().toLowerCase(), entry.getKey());
    }

    for (PropertyDescriptor propertyDescriptor : beanDescriptor.getProperties()) {
      String propertyId = propertyDescriptor.getId();
      Object value = values.get(propertyId);

      if (value == null) {
        propertyId = propertyId.toLowerCase();
        value = values.get(lowerKeyMap.get(propertyId));
      }

      if (value != null) {
        try {
          // Convert
          Object convertedValue =
              this.converterManager.convert(propertyDescriptor.getPropertyClass(), value);

          if (propertyDescriptor.getWriteMethod() != null) {
            propertyDescriptor.getWriteMethod().invoke(bean, convertedValue);
          } else if (propertyDescriptor.getField() != null) {
            propertyDescriptor.getField().set(bean, convertedValue);
          }
        } catch (Exception e) {
          throw new PropertyException("Failed to populate property [" + propertyId + "]", e);
        }

        // "Tick" already populated properties
        values.remove(propertyId);
      } else if (propertyDescriptor.isMandatory()) {
        throw new PropertyMandatoryException(propertyId);
      }
    }
  }