У меня следующий тестовый класс:

@isTest(SeeAllData=false)
private with sharing class classNameTest {

     @isTest
     static testMethod void methodName(){

        // declare a constant
        private static final String PROFILE_NAME = 'System Administrator';

        try{
            // use a constant in SOQL
            Profile p = [SELECT Id FROM Profile WHERE Name=PROFILE_NAME limit 1];
        }

         // remaining code

}

При попытке сохранить файл выдает ошибку:

неожиданный токен PROFILE_NAME.

Как я могу использовать константу в запросе SOQL?

1
Peter Mortensen 15 Сен 2021 в 11:20

2 ответа

Это переменная связывания, поэтому ее необходимо использовать с двоеточием. Также он должен быть объявлен вне метода тестирования. Более того, когда вы используете аннотацию @IsTest для метода, вам не нужно добавлять модификатор testMethod (который устарел). Наконец, SeeAllData по умолчанию является ложным для тестового класса, поэтому нет необходимости добавлять эту аннотацию в класс:

@IsTest
private with sharing class classNameTest {
    // declare constant
    private static final String PROFILE_NAME = 'System Administrator';

    @IsTest
    static void methodName(){        
        try {
            // use constant in soql
            Profile p = [SELECT Id FROM Profile WHERE Name = :PROFILE_NAME limit 1];
        } catch (Exception e){}
         
        // remaining code
    }
}
3
Mariia Illarionova 14 Сен 2021 в 16:33
2
Хороший ответ, который включает в себя некоторые «почему», а не просто «что» или «как» - мне нравятся эти ответы. :) 1) Возможно, вы захотите, чтобы ваше предложение читалось как "Более того, когда вы используете аннотацию @IsTest для метода, вам не нужно..." (я добавил "на метод".) Просто чтобы прояснить любую возможную двусмысленность, поскольку @IsTest также используется в классе. 2) Вы также можете указать, что testmethod устарел, а @IsTest является предпочтительным/рекомендуемым.
 – 
Moonpie
14 Сен 2021 в 16:30
Спасибо за ваш комментарий, я обновил ответ, также не стесняйтесь редактировать его, если хотите)
 – 
Mariia Illarionova
14 Сен 2021 в 16:34

В запросе SOQL отсутствует двоеточие. Должен быть

Profile p = [SELECT Id FROM Profile WHERE Name=:PROFILE_NAME limit 1];

Двоеточие является обязательным, так как оно сообщает Salesforce, что вы пытаетесь связать переменную кода Apex в запросе SOQL. Дополнительные сведения см. в официальной документации Salesforce по этой ссылке. https://developer.salesforce.com/ docs/atlas.en-us.apexcode.meta/apexcode/langCon_apex_SOQL_variables.htm

Также константа должна быть объявлена ​​вне метода на уровне класса.

0
Rohit 15 Сен 2021 в 07:05
Добро пожаловать в Salesforce Stack Exchange (SFSE). Благодарим вас за участие.
 – 
Moonpie
14 Сен 2021 в 16:32
В чем разница? Почему в этом месте должно быть двоеточие? Можете ли вы уточнить? Пожалуйста, ответьте, отредактировав (изменив) свой ответ, а не здесь, в комментариях (без «Редактировать:», «Обновить:» или подобное — ответ должен выглядеть так, как если бы он был написан прямо сейчас).
 – 
Peter Mortensen
14 Сен 2021 в 22:12