title: Salesforce.com Apex Test Class issue: Need to hard code Opportunity Custom Field Value
body: <p>I have a VF page form that has a text field.  The value of this text field is compared to an existing opportunity custom field.  If the value of this text field exists in an opportunity, I go ahead and create a new record.</p>
  
  <p>Everything works out fine except when I create a Apex Test Class.</p>
  
  <p>I need to create an opportunity and hard code the value for the custom field.  Unfortuneatly, this field is not writeable.</p>
  
  <p>Has anyone ran into this issue before?</p>
  
  <p>This is the error that I'm getting:
      Error: Compile Error: Field is not writeable: Opportunity.Deal_Registration_ID__c at line 9 column 103  </p>
  
  <p>Below is my Apex Class.</p>
  
  <p>My test class is at the very bottom.</p>
  
  <p>Any help is greatly appreciated.</p>
  
  <p>Cheers!
  Rommel</p>
  
  <pre><code>public with sharing class VaultVF {
  
  public Vault__c vault {get; set;}
  public List&lt;String&gt; errorMsgs {get; set;}
  public String saveResult {get; set;}
  public String dealReg {get; set;}
  public String oppId {get; set;}
  public String email {get; set;}
  public Boolean scenario1{get; set;}
  public Boolean scenario2{get; set;}
  public Boolean scenario3{get; set;}
  
  // Generates country dropdown from country settings 
  
  public List&lt;SelectOption&gt; getCountriesSelectList() {
      List&lt;SelectOption&gt; options = new List&lt;SelectOption&gt;();
      options.add(new SelectOption('', '-- Select One --'));        
  
      // Find all the countries in the custom setting 
  
      Map&lt;String, Country__c&gt; countries = Country__c.getAll();
  
      // Sort them by name 
  
      List&lt;String&gt; countryNames = new List&lt;String&gt;();
      countryNames.addAll(countries.keySet());
      countryNames.sort();
  
      // Create the Select Options. 
  
      for (String countryName : countryNames) {
          Country__c country = countries.get(countryName);
          options.add(new SelectOption(country.Two_Letter_Code__c, country.Name));
      }
      return options;
  }
  
  //Constructor, set defaults
  public VaultVF(ApexPages.StandardController controller) {
  
      vault = (vault__c)controller.getRecord();
  
      //Populate list of random characters for CAPTCHA verification
      characters = new List&lt;String&gt;{'a','b','c','d','e','f','g','h',
          'i','j','k','m','n','p','q','r','s','t','u','v','w',
          'x','y','z','1','2','3','4','5','6','7','8','9'
      };
  
      errorMsgs = new List&lt;String&gt;();
  
  }
  
  //Determine if page has error so errors message can be displayed
  public boolean getHasErrors(){
      if(ApexPages.hasMessages() == true){
          if(errorMsgs == null){
              errorMsgs = new List&lt;String&gt;();             
          }
  
          //Loop through errors and add to a list
          for(ApexPages.Message m : ApexPages.getMessages()){
              if(m.getSummary().startsWith('Uh oh.')){
                  errorMsgs.add(String.valueOf(m.getSummary()));
              }
          }
      }
      return ApexPages.hasMessages();     
  }
  
  public void save(){
      errorMsgs = new List&lt;String&gt;();
  
      //Make sure captcha was correct
      if(validateCAPTCHA() == false){
          errorMsgs.add('Verification code was incorrect.');
          captchaInput = '';
      }
  
      //Make sure the Scenario is selected        
      if(scenario1 == true){
          vault.Scenario__c = 'BIG-IP as a Firewall';
      }else if(scenario2 == true){
          vault.Scenario__c = 'BIG-IP providing firewall service in conjunction with other vendors';
      }else if(scenario3 == true){
          vault.Scenario__c = 'BIG-IP front ending Firewalls';
          if(vault.Load_Balancer_is_a_Firewall__c == null){
             errorMsgs.add('Please specify if the load balancer is a firewall.');
          }
          if(vault.Providing_DDos_Connection__c == null){
             errorMsgs.add('Please specify if this is providing DDos connection level protection for firewalls or both.');
          }
          if(vault.Providing_DDos_protection_except_ASM__c == null){
             errorMsgs.add('Please specify if we are providing DDos protection (except ASM).');
          }
          if(vault.No_Traffic_Traverse__c == null){
             errorMsgs.add('Please specify if there is Traffic that does not traverse the Firewalls.');
          }
          if(vault.Firewall_Vendor_Name__c == null){
             errorMsgs.add('Please specify a Firewall Vendor.');
          }
      } else {
          errorMsgs.add('Please select one of three Scenarios that is similar to your setup');
      }     
  
      //-----Need to make sure deal registration number on opportuntiy is valid.-----
  
      //Set some sort of is valid deal reg flag to false. We will assume the deal reg Id entered is invalid until we determine it is valid
      vault.isValidDealReg__c = false;
  
      //Query Account Id, and Deal_Registration_Id__c from the opportunity object where the deal registration Id equals the value entered in the form
      List&lt;Opportunity&gt; opps = [select Id, Deal_Registration_ID__c from Opportunity where Deal_Registration_ID__c = :vault.Deal_Registration__c];
  
      //check to see if  registration id on the opp match the entered value    
      if(opps.size() &gt; 0 &amp;&amp; opps[0].Deal_Registration_ID__c == vault.Deal_Registration__c){
  
      //If they do match set the valid deal reg Id flat to true
          vault.isValidDealReg__c = true;
          vault.Related_Opp__c = opps[0].Id;
  
      //If they don't match then query all contacts on the account related to the opportunity
      }
  
      //If is valid deal reg flag is false add a message to the errorMSgs list indicated the entered
      //deal registration is not valid with details on who they should contact
      if(errorMsgs.size()&gt;0){
          //stop here
      } else if(vault.isValidDealReg__c == false){
          errorMsgs.add('Deal Registration # was incorrect. Please contact your representative.');
      } else {
          try{
              vault.Status__c = 'Application Received';
              insert vault;
              saveResult = 'success';
  
          }catch(exception e){
              ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.FATAL, 'Uh oh. Something didn\'t work quite right. Please contact partners@f5.com for assistance. \n\n' + e.getMessage()));                
              saveResult = 'fail';
          }
      }
  
  }
  
  //------------------------Code for CAPTCHA verification----------------------------
  public String captchaInput {get; set;}
  List&lt;String&gt; characters;
  String char1; 
  String char3; 
  String char5;
  
  //This methods simply returns a random number between 0 and the size of the character list
  public Integer randomNumber(){
      Integer random = Math.Round(Math.Random() * characters.Size());
      if(random == characters.size()){
          random--;
      }
      return random;
  }
  
  /*Here we have 6 get methods that return 6 random characters to the page.
  For chars 1,3, and 5 (the black characters) we are saving the the values so 
  that we can compare them with the user's input */
  public String getChar1(){
      char1 = characters[randomNumber()];
      return char1;
  }
  public String getChar2(){
      return characters[randomNumber()];
  }
  public String getChar3(){
      char3 = characters[randomNumber()];
      return char3;
  }
  public String getChar4(){
      return characters[randomNumber()];
  }
  public String getChar5(){
      char5 = characters[randomNumber()];
      return char5;
  }
  public String getChar6(){
      return characters[randomNumber()];
  }
  
  public String correctAnswer(){
      return char1 + char3 + char5;   
  }
  
  public Boolean validateCAPTCHA(){
      if(captchaInput.length() == 3 &amp;&amp; captchaInput.subString(0,1) == char1 &amp;&amp; captchaInput.subString(1,2) == char3 &amp;&amp; captchaInput.subString(2,3) == char5){
          return true;
      }else{
          return false;
      }
  }
  </code></pre>
  
  <p>}</p>
  
  <p>Below is Test Class</p>
  
  <pre><code>@isTest
  public class VaultVFTEST {
  
  /*This tests the VaultVF class on the Vault__c object*/
  
  static testMethod void VaultVFTEST() {
  
      //Create opp, hardcode the Deal_Registration_Id__c field with 'x111111111' and insert opp
      Opportunity opp = new Opportunity(Name='test opp', StageName='stage', Deal_Registration_Id__c='x111111111', Probability = 95, CloseDate=system.today());
      insert opp;
  
      //Create and insert Vault record
      Vault__c vault = new Vault__c(
          Deal_Registration__c = 'x111111111',
          Scenario__c = 'BIG-IP front ending Firewalls',
          isValidDealReg__c = true,
          Status__c = 'Application Received',
          Load_Balancer_is_a_Firewall__c = 'Yes',
          Providing_DDos_Connection__c = 'Firewalls',
          Providing_DDos_protection_except_ASM__c = 'Yes',
          No_Traffic_Traverse__c = 'Yes',
          Firewall_Vendor_Name__c = 'Firewall Vendor Company',
          First_Name__c = 'Test First Name',
          Last_Name__c = 'Test Last Name',
          Company_Name__c = 'Test Company Name',
          Phone__c = '(206) 946-3126',
          Email__c = 'test@email.com',
          Country__c = 'United States',
          Additional_Info__c = 'Test Additional Info',
          Related_Opp__c = opp.Id
      );
  
      //Now insert the vault record to invoke the VaultVF class
      Test.startTest();
      insert vault;
      Test.stopTest();
  
      //Assertion Testing - Check to make sure the Deal_Registration__c value
      //matches the Deal_Registration_Id__c value of the related opportunity
      for(Vault__c v : [select Id, Deal_Registration__c from Vault__c where Deal_Registration__c IN :vault]){
          system.assertEquals(v.Deal_Registration__c, opp.Deal_Registration_Id__c);
      }
  }
  }
  </code></pre>