You need to sign in to do that
Don't have an account?
sumit d
Field is not writeable in test class
HI All,
I have a test class which is giving me error when i try to run it.
System.SObjectException: Field is not writeable: rie__Registrant_Exhibitor__c.rie__Registration__c
My class is below:-
public without sharing class BatchMatchMaking implements Database.Batchable<sObject>{
// Start Method
public Database.queryLocator start(Database.BatchableContext bc){
return Database.getQueryLocator('Select id, rie__BatchProcessedForMatchMaking__c '+
'from rie__Registration__c '+
'where rie__BatchProcessedForMatchMaking__c = false');
}
//Execute Method
public void execute(Database.BatchableContext BC, List<rie__Registration__c> regList){
RegistrationTriggerHelper.runTrigger = false;
Set<Id> regIds = new Set<Id>();
if(regList != Null && regList.size() > 0){
for(rie__Registration__c regobj : regList){
regObj.rie__BatchProcessedForMatchMaking__c = true;
regIds.add(regObj.Id);
}
}
if(regIds != Null && regIds.size() > 0){
Map<Id, rie__Registrant_Answer__c> regQuestionAnswersMap = new Map<Id, rie__Registrant_Answer__c>();
//Get all the registrant Answers related to Registrants
List<rie__Registrant_Answer__c> regAnswersList = new List<rie__Registrant_Answer__c>([Select id, rie__Question__c,
rie__Answer__c, rie__Registration__c
from rie__Registrant_Answer__c
where rie__Registration__c IN: regIds]);
if(regAnswersList != Null && regAnswersList.size() > 0){
for(rie__Registrant_Answer__c regAnswers : regAnswersList){
regQuestionAnswersMap.put(regAnswers.rie__Question__c , regAnswers);
}
}
if(regQuestionAnswersMap != Null && regQuestionAnswersMap.size() > 0){
// This map contains Exhibitor as a key and Final score as value
Map<Id , Integer> exhibitorTotalScoreMap = new Map<Id , Integer>();
//Get All Exhibitor Questionsand Score
List<rie__Exhibitor_Question__c> exhibitorQuestionsList = new List<rie__Exhibitor_Question__c>([Select id, rie__Answer__c,
rie__Exhibitor__c, rie__Question__c ,
rie__Score__c
from rie__Exhibitor_Question__c
where rie__Question__c IN: regQuestionAnswersMap.keySet()]);
List<rie__Registrant_Exhibitor__c> regExhibitorListToInsert = new List<rie__Registrant_Exhibitor__c>();
Set<Id> registrantIds = new Set<Id>();
if(exhibitorQuestionsList != Null && exhibitorQuestionsList.size() > 0){
for(rie__Exhibitor_Question__c exhibitorQuestions : exhibitorQuestionsList){
if(regQuestionAnswersMap.containsKey(exhibitorQuestions.rie__Question__c) &&
exhibitorQuestions.rie__Score__c != Null &&
exhibitorQuestions.rie__Answer__c == regQuestionAnswersMap.get(exhibitorQuestions.rie__Question__c).rie__Answer__c){
Integer totalScoreList = 0;
if(exhibitorTotalScoreMap.containsKey(exhibitorQuestions.rie__Exhibitor__c)){
totalScoreList = exhibitorTotalScoreMap.get(exhibitorQuestions.rie__Exhibitor__c);
totalScoreList = totalScoreList + Integer.valueOf(exhibitorQuestions.rie__Score__c);
}else{
totalScoreList = Integer.valueOf(exhibitorQuestions.rie__Score__c);
}
exhibitorTotalScoreMap.put(exhibitorQuestions.rie__Exhibitor__c , totalScoreList);
registrantIds.add(regQuestionAnswersMap.get(exhibitorQuestions.rie__Question__c).rie__Registration__c);
}
}
//Get all the existing registrant exhibior
List<rie__Registrant_Exhibitor__c> regExihibitorList = new List<rie__Registrant_Exhibitor__c>([Select id, rie__Registration__c
from rie__Registrant_Exhibitor__c
where rie__Registration__c IN: registrantIds]);
Map<Id, rie__Registrant_Exhibitor__c> registrantExhibitorMap = new Map<Id, rie__Registrant_Exhibitor__c>();
if(regExihibitorList != Null && regExihibitorList.size() > 0){
for(rie__Registrant_Exhibitor__c regExhibitor : regExihibitorList){
registrantExhibitorMap.put(regExhibitor.rie__Registration__c, regExhibitor);
}
}
Integer finalScore = 0;
for(rie__Exhibitor_Question__c exhibitorQuestions : exhibitorQuestionsList){
//Checking for exhibitor question
if(regQuestionAnswersMap.containsKey(exhibitorQuestions.rie__Question__c)){
//Checking for registrant answer
if(exhibitorQuestions.rie__Answer__c == regQuestionAnswersMap.get(exhibitorQuestions.rie__Question__c).rie__Answer__c){
if(exhibitorTotalScoreMap.containsKey(exhibitorQuestions.rie__Exhibitor__c) &&
finalScore < exhibitorTotalScoreMap.get(exhibitorQuestions.rie__Exhibitor__c)){
//Checking for any existing registrant exhibitor
rie__Registrant_Exhibitor__c regExhibitor;
if(registrantExhibitorMap.containsKey(regQuestionAnswersMap.get(exhibitorQuestions.rie__Question__c).rie__Registration__c)){
regExhibitor = new rie__Registrant_Exhibitor__c(Id = registrantExhibitorMap.get(regQuestionAnswersMap.get(exhibitorQuestions.rie__Question__c).rie__Registration__c).Id);
}else{
regExhibitor = new rie__Registrant_Exhibitor__c();
}
regExhibitor.rie__Registration__c = regQuestionAnswersMap.get(exhibitorQuestions.rie__Question__c).rie__Registration__c; // Error is coming from here
finalScore = exhibitorTotalScoreMap.get(exhibitorQuestions.rie__Exhibitor__c);
regExhibitor.rie__Exhibitor__c = exhibitorQuestions.rie__Exhibitor__c;
regExhibitor.rie__Score__c = finalScore;
regExhibitorListToInsert.add(regExhibitor);
}
}
}
}
}
//upsert the new Registrant Exhibitors
if(regExhibitorListToInsert != Null && regExhibitorListToInsert.size() > 0){
upsert regExhibitorListToInsert;
}
}
}
update regList;
}
//Finish Method for batch
public void finish(Database.BatchableContext BC){
}
}
My test class is below:-
@istest
private class BatchMatchMakingTest {
static testmethod void matchMakingMethod(){
rie__Event__c evt = new rie__Event__c();
evt.rie__Event_Time_Zone__c = '(GMT-07:00) Pacific Daylight Time (America/Los_Angeles)';
insert evt;
rie__Registration__c attendee = new rie__Registration__c();
attendee.rie__BatchProcessedForMatchMaking__c = false;
attendee.rie__Event__c = evt.id;
insert attendee;
rie__Question__c qus = new rie__Question__c();
qus.rie__Question__c = 'Are you looking for a Solution?';
insert qus;
rie__Registrant_Answer__c regAns = new rie__Registrant_Answer__c();
regAns.rie__Question__c = qus.id;
regAns.rie__Registration__c = attendee.id;
regAns.rie__Answer__c = 'yes';
insert regAns;
rie__Exhibitor__c ex = new rie__Exhibitor__c();
insert ex;
rie__Exhibitor_Question__c eq = new rie__Exhibitor_Question__c();
eq.rie__Question__c = qus.id;
eq.rie__Exhibitor__c = ex.id;
eq.rie__Answer__c = 'yes';
eq.rie__Score__c = 50;
insert eq;
rie__Registrant_Exhibitor__c rex = new rie__Registrant_Exhibitor__c();
rex.rie__Exhibitor__c = ex.id;
rex.rie__Registration__c = attendee.id;
insert rex;
Test.startTest();
BatchMatchMaking cp = new BatchMatchMaking();
Database.executeBatch(cp);
Test.stopTest();
rie__Registrant_Exhibitor__c ras = [select id,rie__Exhibitor__c,rie__Registration__c
from rie__Registrant_Exhibitor__c
where id =: rex.id];
system.assertEquals(rex.rie__Exhibitor__c,ras.rie__Exhibitor__c );
system.assertEquals(rex.rie__Registration__c,ras.rie__Registration__c );
}
}
how to solve this error?
I have a test class which is giving me error when i try to run it.
System.SObjectException: Field is not writeable: rie__Registrant_Exhibitor__c.rie__Registration__c
My class is below:-
public without sharing class BatchMatchMaking implements Database.Batchable<sObject>{
// Start Method
public Database.queryLocator start(Database.BatchableContext bc){
return Database.getQueryLocator('Select id, rie__BatchProcessedForMatchMaking__c '+
'from rie__Registration__c '+
'where rie__BatchProcessedForMatchMaking__c = false');
}
//Execute Method
public void execute(Database.BatchableContext BC, List<rie__Registration__c> regList){
RegistrationTriggerHelper.runTrigger = false;
Set<Id> regIds = new Set<Id>();
if(regList != Null && regList.size() > 0){
for(rie__Registration__c regobj : regList){
regObj.rie__BatchProcessedForMatchMaking__c = true;
regIds.add(regObj.Id);
}
}
if(regIds != Null && regIds.size() > 0){
Map<Id, rie__Registrant_Answer__c> regQuestionAnswersMap = new Map<Id, rie__Registrant_Answer__c>();
//Get all the registrant Answers related to Registrants
List<rie__Registrant_Answer__c> regAnswersList = new List<rie__Registrant_Answer__c>([Select id, rie__Question__c,
rie__Answer__c, rie__Registration__c
from rie__Registrant_Answer__c
where rie__Registration__c IN: regIds]);
if(regAnswersList != Null && regAnswersList.size() > 0){
for(rie__Registrant_Answer__c regAnswers : regAnswersList){
regQuestionAnswersMap.put(regAnswers.rie__Question__c , regAnswers);
}
}
if(regQuestionAnswersMap != Null && regQuestionAnswersMap.size() > 0){
// This map contains Exhibitor as a key and Final score as value
Map<Id , Integer> exhibitorTotalScoreMap = new Map<Id , Integer>();
//Get All Exhibitor Questionsand Score
List<rie__Exhibitor_Question__c> exhibitorQuestionsList = new List<rie__Exhibitor_Question__c>([Select id, rie__Answer__c,
rie__Exhibitor__c, rie__Question__c ,
rie__Score__c
from rie__Exhibitor_Question__c
where rie__Question__c IN: regQuestionAnswersMap.keySet()]);
List<rie__Registrant_Exhibitor__c> regExhibitorListToInsert = new List<rie__Registrant_Exhibitor__c>();
Set<Id> registrantIds = new Set<Id>();
if(exhibitorQuestionsList != Null && exhibitorQuestionsList.size() > 0){
for(rie__Exhibitor_Question__c exhibitorQuestions : exhibitorQuestionsList){
if(regQuestionAnswersMap.containsKey(exhibitorQuestions.rie__Question__c) &&
exhibitorQuestions.rie__Score__c != Null &&
exhibitorQuestions.rie__Answer__c == regQuestionAnswersMap.get(exhibitorQuestions.rie__Question__c).rie__Answer__c){
Integer totalScoreList = 0;
if(exhibitorTotalScoreMap.containsKey(exhibitorQuestions.rie__Exhibitor__c)){
totalScoreList = exhibitorTotalScoreMap.get(exhibitorQuestions.rie__Exhibitor__c);
totalScoreList = totalScoreList + Integer.valueOf(exhibitorQuestions.rie__Score__c);
}else{
totalScoreList = Integer.valueOf(exhibitorQuestions.rie__Score__c);
}
exhibitorTotalScoreMap.put(exhibitorQuestions.rie__Exhibitor__c , totalScoreList);
registrantIds.add(regQuestionAnswersMap.get(exhibitorQuestions.rie__Question__c).rie__Registration__c);
}
}
//Get all the existing registrant exhibior
List<rie__Registrant_Exhibitor__c> regExihibitorList = new List<rie__Registrant_Exhibitor__c>([Select id, rie__Registration__c
from rie__Registrant_Exhibitor__c
where rie__Registration__c IN: registrantIds]);
Map<Id, rie__Registrant_Exhibitor__c> registrantExhibitorMap = new Map<Id, rie__Registrant_Exhibitor__c>();
if(regExihibitorList != Null && regExihibitorList.size() > 0){
for(rie__Registrant_Exhibitor__c regExhibitor : regExihibitorList){
registrantExhibitorMap.put(regExhibitor.rie__Registration__c, regExhibitor);
}
}
Integer finalScore = 0;
for(rie__Exhibitor_Question__c exhibitorQuestions : exhibitorQuestionsList){
//Checking for exhibitor question
if(regQuestionAnswersMap.containsKey(exhibitorQuestions.rie__Question__c)){
//Checking for registrant answer
if(exhibitorQuestions.rie__Answer__c == regQuestionAnswersMap.get(exhibitorQuestions.rie__Question__c).rie__Answer__c){
if(exhibitorTotalScoreMap.containsKey(exhibitorQuestions.rie__Exhibitor__c) &&
finalScore < exhibitorTotalScoreMap.get(exhibitorQuestions.rie__Exhibitor__c)){
//Checking for any existing registrant exhibitor
rie__Registrant_Exhibitor__c regExhibitor;
if(registrantExhibitorMap.containsKey(regQuestionAnswersMap.get(exhibitorQuestions.rie__Question__c).rie__Registration__c)){
regExhibitor = new rie__Registrant_Exhibitor__c(Id = registrantExhibitorMap.get(regQuestionAnswersMap.get(exhibitorQuestions.rie__Question__c).rie__Registration__c).Id);
}else{
regExhibitor = new rie__Registrant_Exhibitor__c();
}
regExhibitor.rie__Registration__c = regQuestionAnswersMap.get(exhibitorQuestions.rie__Question__c).rie__Registration__c; // Error is coming from here
finalScore = exhibitorTotalScoreMap.get(exhibitorQuestions.rie__Exhibitor__c);
regExhibitor.rie__Exhibitor__c = exhibitorQuestions.rie__Exhibitor__c;
regExhibitor.rie__Score__c = finalScore;
regExhibitorListToInsert.add(regExhibitor);
}
}
}
}
}
//upsert the new Registrant Exhibitors
if(regExhibitorListToInsert != Null && regExhibitorListToInsert.size() > 0){
upsert regExhibitorListToInsert;
}
}
}
update regList;
}
//Finish Method for batch
public void finish(Database.BatchableContext BC){
}
}
My test class is below:-
@istest
private class BatchMatchMakingTest {
static testmethod void matchMakingMethod(){
rie__Event__c evt = new rie__Event__c();
evt.rie__Event_Time_Zone__c = '(GMT-07:00) Pacific Daylight Time (America/Los_Angeles)';
insert evt;
rie__Registration__c attendee = new rie__Registration__c();
attendee.rie__BatchProcessedForMatchMaking__c = false;
attendee.rie__Event__c = evt.id;
insert attendee;
rie__Question__c qus = new rie__Question__c();
qus.rie__Question__c = 'Are you looking for a Solution?';
insert qus;
rie__Registrant_Answer__c regAns = new rie__Registrant_Answer__c();
regAns.rie__Question__c = qus.id;
regAns.rie__Registration__c = attendee.id;
regAns.rie__Answer__c = 'yes';
insert regAns;
rie__Exhibitor__c ex = new rie__Exhibitor__c();
insert ex;
rie__Exhibitor_Question__c eq = new rie__Exhibitor_Question__c();
eq.rie__Question__c = qus.id;
eq.rie__Exhibitor__c = ex.id;
eq.rie__Answer__c = 'yes';
eq.rie__Score__c = 50;
insert eq;
rie__Registrant_Exhibitor__c rex = new rie__Registrant_Exhibitor__c();
rex.rie__Exhibitor__c = ex.id;
rex.rie__Registration__c = attendee.id;
insert rex;
Test.startTest();
BatchMatchMaking cp = new BatchMatchMaking();
Database.executeBatch(cp);
Test.stopTest();
rie__Registrant_Exhibitor__c ras = [select id,rie__Exhibitor__c,rie__Registration__c
from rie__Registrant_Exhibitor__c
where id =: rex.id];
system.assertEquals(rex.rie__Exhibitor__c,ras.rie__Exhibitor__c );
system.assertEquals(rex.rie__Registration__c,ras.rie__Registration__c );
}
}
how to solve this error?
Do you have a master detail relationship between rie__Registrant_Exhibitor__c and rie__Registration__c? If it's master-detail then, by default, you can't 'reparent' the record, that is, write to the rie__Registration__c field after the detail record has been created. You can, however, select 'Allow Reparenting' in the master-detail relationship definition to make it work
Reference: https://developer.salesforce.com/forums/?id=906F00000009MrpIAE
Anudeep
All Answers
Do you have a master detail relationship between rie__Registrant_Exhibitor__c and rie__Registration__c? If it's master-detail then, by default, you can't 'reparent' the record, that is, write to the rie__Registration__c field after the detail record has been created. You can, however, select 'Allow Reparenting' in the master-detail relationship definition to make it work
Reference: https://developer.salesforce.com/forums/?id=906F00000009MrpIAE
Anudeep
Yes, its master-detail relationship. Can you tell me how can I update the code so that this error could be removed?
Can you try selecting 'Allow Reparenting' option in the master-detail relationship definition without making any changes to code to see if it works? Thanks
https://help.salesforce.com/articleView?id=relationships_considerations.htm&language=en&r=https%3A%2F%2Fwww.google.com%2F&type=5
Anudeep
In you code, it seems rie__Registration__c does not need to be changed if registrantExhibitorMap.containsKey(xxxx) is true. Variable rie__Registration__c only needs to be assiged a value when you instanitiate a new variable.
I would suggest you change your code a bit to fix the error.
}else{
regExhibitor = new rie__Registrant_Exhibitor__c();
regExhibitor.rie__Registration__c = regQuestionAnswersMap.get(exhibitorQuestions.rie__Question__c).rie__Registration__c;
}
Will it affect data in my org if I select Allow reparenting checkbox?