В своем макете (по фреймворку или иным образом) вам все равно придется в конечном итоге создавать объекты Person со значениями, что возвращает вас к исходной проблеме.
К счастью, есть два отличных решения:
1) Идите и добавьте сеттеры в класс Person, но сделайте их защищенными. Это означает, что ваш макет и тестовый код должны быть в одном пакете, но не позволят другим пользователям изменять ваши персоны. (и мы не хотим, чтобы вокруг бегали мутанты - этого было достаточно в кино в последнее время).
2) Используйте класс Builder (как Джошуа Блох описывает в Effective Java). Вы должны создать открытый статический класс PersonBuilder внутри Person, который будет экспортировать метод построения и цепные спецификаторы параметров (например, сеттеры, но не вызываемые отдельно):
public class Person ....
public static class PersonBuilder {
public PersonBuilder (String firstName, String lastName) {...} // my sample has two required values
public Person build() { ... }
public PersonBuilder ssn (String value) { ... }
public PersonBuilder adsPath (String value) { ... }
...
}
...
}
Спецификаторы цепочечных значений выглядят так:
public PersonBuilder ssn (String value) {
this.sn = value;
return this;
}
Тогда вызов для создания Персоны выглядит так:
Person thisPerson = new Person.PersonBuilder ("John", "Smith").ssn("123-45-6789").adsPath("whatever");
Этот метод полностью скрывает методы, которые могут устанавливать значения (на самом деле у вас нет «установщиков»), но не позволяет вам иметь дело с длинными списками аргументов конструктора (что облегчает работу с необязательными значениями).
Кстати, вы также, вероятно, хотите сделать конструктор Person личным.