| `@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: |
| |
| ```java |
| @Test |
| public void test() { |
| MyAutoValue myAutoValue = mock(MyAutoValue.class); |
| when(myAutoValue.getFoo()).thenReturn("foo"); |
| } |
| ``` |
| |
| Prefer simply constructing an instance: |
| |
| ```java |
| @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][wither] to create |
| test instances with just the fields you care about. Consider using |
| |
| [builder]: https://github.com/google/auto/blob/master/value/userguide/builders.md |
| [wither]: https://github.com/google/auto/blob/master/value/userguide/builders-howto.md#withers |
| |
| ```java |
| private MyAutoValue.Builder myAutoValueBuilder() { |
| return MyAutoValue.builder().bar(42).baz(false); |
| } |
| |
| @Test |
| public void test() { |
| MyAutoValue myAutoValue = myAutoValueBuilder.foo("foo").build(); |
| } |
| ``` |
| |
| or: |
| |
| ```java |
| 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"); |
| } |
| ``` |