Discovered something doing a unit test today
SObject class method isClone()
does not return true unless the clone source SObject exists in the database.
Account a = new Account(name = '00clonesrc'); insert a; Account aClone = a.clone(false,true,false,false); system.debug(LoggingLevel.Info,'isClone='+aClone.isClone());
The debug line shows as: isClone=true
but, don’t do the insert as in this example:
Account a = new Account(name = '00clonesrc'); Account aClone = a.clone(false,true,false,false); system.debug(LoggingLevel.Info,'isClone='+aClone.isClone());
The debug line shows as: isClone=false
Normally, this might not be an issue but I was unit testing a service layer method and passing cloned sobjects in as arguments without doing the database operation in order to make the tests run faster. This is one place where the DML is required in order to get isClone()
to work as expected.
Update 2016-10-04
Per suggestion by Adrian Larson, I retried using a dummy ID
Account a = new Account(id = '001000000000000000', name = '00clonesrc'); Account aClone = a.clone(false,true,false,false); system.debug(LoggingLevel.Info,'isClone='+aClone.isClone());
The debug line shows as: isClone=true
What if you give the record a dummy Id value?
good idea (someone actually reads my blog ?!) . I tried it and
isClone()
returns true. I guess this makes sense in that a UI clone must be of an sobject with an ID. Needless to say, the doc is not clear on this point.