The disadvantage is that there is a lot of boilerplate code; the advantage is that you can add some methods that may relate to your application business (like the getInstance that is taking a user instead of an accessToken, in the above case).

In your case I would create a non-final RainOnTrees class that delegate to the final class. Or, if you can make it non-final, it would be better.

Please look at JMockit. It has extensive documentation with a lot of examples. Here you have an example solution of your problem (to simplify I've added constructor to Seasons to inject mocked RainOnTrees instance):

It should be noticed that delegates is very different from native spy mocking. In a native mockito spy, "this" in the instance reference to the spy itself (because is use subclass) However, in delegate, "this" will be the real object someInstanceThatIsNotMockableOrSpyable. Not the spy. Thus, there is no way to doReturn/verify for self-calling functions.
–
Dennis CheungJan 29 at 10:04

Another workaround, which may apply in some cases, is to create an interface that is implemented by that final class, change the code to use the interface instead of the concrete class and then mock the interface. This lets you separate the contract (interface) from the implementation (final class). Of course, if what you want is really to bind to the final class, this will not apply.