Спецификаторы доступа к Apex и тестовые классы

Я вижу поведение в коде SalesForce Apex, которое не понимаю. Кажется, это нарушает правила безопасности кода. У меня есть контроллер, который выглядит примерно так:

public with sharing class CaseController {

    //Properties
    public Case TheCase { get; private set; }

    //
    //Constructor
    public CaseController(ApexPages.StandardController controller) {
        //Some unimportant stuff
    }

    //
    //Validates all data coming in from the view and saves the case
    public PageReference Save() {
        //Some other unimportant stuff
    }
 }

И тест, который выглядит примерно так:

private static testMethod void Save_WithCompleteCase_SavesCase() 
{
    //Given
    User user = GetTestUser('Standard User');
    Product2 theProduct = GetTestProduct();
    Case theCase = GetTestCase(user, theProduct);

    System.runAs(user) {

        //When
        CaseController controller = new CaseController(new ApexPages.StandardController(theCase));
        controller.TheCase.Subject = 'Test Case'; //Making a change to test it saved
        PageReference page = controller.Save();

        //Then

    }
 }

Обратите внимание, что у моего контроллера есть частный сеттер для «TheCase», но я могу изменить его значение в тестовом классе. Этот код работает и обрабатывается SalesForce. Почему? Есть ли что-то особенное в тестовых классах, которые позволяют им получать доступ к закрытым членам других классов?

Спасибо!!


person Todd Gardner    schedule 16.03.2011    source источник


Ответы (1)


Да, я не думал ясно раньше. Сеттер является закрытым для самого свойства Case, но свойства Case, такие как subject, по-прежнему общедоступны.

Создание закрытого набора свойств Case защищает только контроллер от изменения Case из-под него.

Прости!!

person Todd Gardner    schedule 17.03.2011
comment
Черт возьми - я увидел это в своей RSS-ленте и подумал, что получу легкие 10 баллов ;-) - person metadaddy; 17.03.2011