package com.example.dev;
public class AClass {
private Integer a =10;
...//other code
}
and when I try to access a in my Spock method:
package com.example.dev;
def 'test a'() {
AClass aClassVar = new AClass()
aClassVar.a = new Integer(100);
...//other testing stuff
}
It works fine. Why this happens? Is Spock use reflection for accessing the private fields? Or my encapsulation in not written well?
Spock isn't guilty, it's groovy itself, see: Private method in groovy is not private.
While it's possible to refer to private members of class, it's definitely not a good practice.
It's my understanding that
aClassVar.a = new Integer(100)
in Groovy / Spock is just syntactic sugar for
aClassVar.setA(new Integer(100));
in Java. There have been occasions where I tried to do that and there WASN'T a setter and Spock griped.
As for why we create private attributes and then give them setters, THAT is another discussion.