3

I have an apex class like that :

@AuraEnabled
public static WrapperFilters manageFilters(Map<String, Object> lines){
   Map<Object, Object> mapLineDetail = new Map<Object, Object>();
    //iterate through inserted lines
    for(String key : lines.keySet()){
        mapLineDetail = (Map<Object, Object>)lines.get(key); //line where the test class fail
        //other code like that :
        if(mapLineDetail.get('ObjectName') == 'Account') {
            //....
        }
    }
}

And here is the test method for this method :

@isTest static void manageFilters_Test() {
    LCR01_AccountList.WrapperLine wrapLine = new LCR01_AccountList.WrapperLine();
    wrapLine.ObjectName = 'Opportunity';
    wrapLine.FieldName = 'Amount';
    wrapLine.Operator = '<';
    wrapLine.Value = '10000';

    system.debug('### wrapLine : ' + wrapLine);

    Map<String, Object> mapFilters = new Map<String, Object>();

    String filter = '{FieldName=AccountId, FieldType=, ObjectName=Opportunity, Operator==, Value=0016E00000TIZUYQA5}';
    Object myObj = filter;
    System.debug('### myObj : ' + myObj);
    mapFilters.put('1', myObj);

    Test.startTest();
    LCR01_AccountList.WrapperFilters wrap = LCR01_AccountList.manageFilters(mapFilters);
    Test.stopTest();
}

The problem is when I run the test class I got this error :

System.TypeException: Invalid conversion from runtime type String to Map

I test many things but I can't get over this error. The test fail at the line indicated in the apex method mapLineDetail = (Map<Object, Object>)lines.get(key);

I specify that the code (apex class) actually works.

1 Answer 1

5

You are trying to cast the result of lines.get(key) into a Map<Object, Object>, whereas actually it is of the String type.

Just notice how you initialize it in your test:

Map<String, Object> mapFilters = new Map<String, Object>();
String filter = '{FieldName=AccountId,...}';
Object myObj = filter;
mapFilters.put('1', myObj);

Here myObj is a String

So you should do mapLineDetail = (String)lines.get(key); instead.

UPDATE:

When you declare and initialize String filter = '{FieldName=AccountId,...}'; it creates just a string, but in fact your code expects the filter argument to be Map<Object,Object>.

So all you need to do in you test class is update the line String filter = with:

Map<Object,Object> filter = new Map<Object,Object>{'FieldName'=>'AccountId', 'FieldType'=>'datetime', 'ObjectName'=>'Opportunity', 'Operator'=>'=<', 'Value'=>'0016E00000TIZUYQA5'}; 
8
  • Actually I need mapLineDetail to be a Map<Object, Object> because I use it later in the code...
    – dou
    Jul 12, 2018 at 8:38
  • then you need to think about altering your implementation. As a quick fix, you can do mapLineDetail = new Map<Object,Object> {<some key>, lines.get(key)};
    – Eduard
    Jul 12, 2018 at 8:41
  • If I do that, it works for the unit test, but in real test it does not work anymore
    – dou
    Jul 12, 2018 at 8:47
  • Maybe because in a real run it is not get executed (e.g. your code never calls the manageFilters method, or the lines parameter is empty)?
    – Eduard
    Jul 12, 2018 at 8:51
  • 1
    Aha, try this in your test class Map<Object,Object> filter = new Map<Object,Object>{'FieldName'=>'AccountId', 'FieldType'=>'datetime', 'ObjectName'=>'Opportunity', 'Operator'=>'=<', 'Value'=>'0016E00000TIZUYQA5'}; When you create String filter = '{FieldName=AccountId,...}'; it creates just a string, whereas your code expects the filter to be Map<Object,Object>
    – Eduard
    Jul 13, 2018 at 13:45

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .