The 3rd option is definitely better than the other two for the reasons you've given. I like to refer to the Maven directory structure during times like this, and it doesn't seem to imply anything different than your 3rd option.
What I do is create the stub as an inner class inside the test itself. Once this gets too messy or needs to be reused, I put the stubs in the same package as the abstract class, but under the test
directory.
It might be worth knowing that a lot of projects evolve to have "Builder" objects that work like this:
Person person = new PersonBuilder().withName("John Doe").withDefaultAddress().build();
The reason you do this is because sometimes a Person
needs to be created lots of different ways depending on what you're testing. Having just one PersonStub
may not be enough.