@AutoValue is used to represent pure data classes. Mocking these should not be necessary: prefer constructing them in the same way production code would.
To make the argument another way: the fact that AutoValue classes are not final is an implementation detail of the way they're generated. They should be regarded as logically final insofar as they must not be extended by non-generated code. If they were final, they also would not be mockable.
Instead of mocking:
@Test public void test() { MyAutoValue myAutoValue = mock(MyAutoValue.class); when(myAutoValue.getFoo()).thenReturn("foo"); }
Prefer simply constructing an instance:
@Test public void test() { MyAutoValue myAutoValue = MyAutoValue.create("foo"); }
If your AutoValue has multiple required fields, and only one is relevant for a test, consider using a builder or with-style methods to create test instances with just the fields you care about. Consider using
private MyAutoValue.Builder myAutoValueBuilder() { return MyAutoValue.builder().bar(42).baz(false); } @Test public void test() { MyAutoValue myAutoValue = myAutoValueBuilder.foo("foo").build(); }
or:
private static final MyAutoValue MY_AUTO_VALUE = MyAutoValue.create(/* foo= */ "", /* bar= */ 42, /* baz= */ false); @Test public void test() { MyAutoValue myAutoValue = MY_AUTO_VALUE.withFoo("foo"); }