protected Object fillMap(Object o, TypeToken typeToken, ITestContext iTestContext) {
        ITestParamState iTestState = iTestContext.getCurrentParam();
        Map<Object, Object> m = (Map<Object, Object>) o;
        if ( null != iTestContext.getCurrentParam() && null != iTestContext.getCurrentParam().getAttribute(ITestConstants.ATTRIBUTE_CLASS) ) {
            Class<?> mapClass = iTestConfig.getITestValueConverter()
                    .convert(Class.class, iTestContext.getCurrentParam().getAttribute(ITestConstants.ATTRIBUTE_CLASS));
            m = (Map<Object, Object>) newInstance(mapClass, iTestContext);
        }
        if ( null == m ) {
            m = new HashMap<Object, Object>();
        } else {
            m.clear();
        }
        int size = random.nextInt(RANDOM_MAX - RANDOM_MIN) + RANDOM_MIN;
        if ( null != iTestState && iTestState.getSizeParam() != null ) {
            size = iTestState.getSizeParam();
            //to overwrite expected value
            if ( 0 == size ) {
                iTestContext.enter(m, "<map>");
                iTestContext.leave(null);
            }
        }
        TypeToken keyType = resolveParametrizedType(typeToken, Map.class, 0);
        TypeToken valueType = resolveParametrizedType(typeToken, Map.class, 1);
        for (int i = 0; i < size; i++) {
            iTestContext.enter(m, String.valueOf(i));
            iTestContext.enter("Map.Entry", "key");
            ITestParamState eITestState = iTestState == null ? null : iTestState.getElement(String.valueOf(i));
            Object key = generateRandom(keyType.getType(), iTestContext);
            iTestContext.leave(key);
            iTestContext.enter("Map.Entry", "value");
            Object value = generateRandom(valueType.getType(), iTestContext);
            iTestContext.leave(value);
            m.put(key, value);
            iTestContext.leave("Map.Entry");
        }
        return m;
    }