Especificadores de acceso de Apex y clases de prueba
-
26-10-2019 - |
Pregunta
Estoy viendo algo de comportamiento en el código Apex de Salesforce que no entiendo. Parece romper las reglas de seguridad del código. Tengo un controlador que se parece a esto:
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
}
}
Y una prueba que se parece a esto:
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
}
}
Tenga en cuenta que mi controlador tiene un setter privado en "TheCase", pero puedo cambiar su valor en la clase de prueba. Este código funciona y es procesado por Salesforce. ¿Por qué? ¿Hay algo especial en las clases de prueba que les permitan acceder a miembros privados de otras clases?
¡¡Gracias!!
Solución
Duh, no estaba pensando claramente antes. El setter es privado en la propiedad del caso en sí, pero las propiedades del caso, como el sujeto, aún son accesibles públicamente.
Hacer que el conjunto privado de la propiedad del caso solo proteja al controlador de que el caso cambie de debajo de él.
¡¡Lo siento!!