What you are asking is not possible because your legacy code relies on a static method getInstance()
and Mockito does not allow to mock static methods, so the following line won’t work
when(FormatterService.getInstance()).thenReturn(formatter);
There are 2 ways around this problem:
-
Use a different mocking tool, such as PowerMock, that allows to mock static methods.
-
Refactor your code, so that you don’t rely on the static method. The least invasive way I can think of to achieve this is by adding a constructor to
DriverSnapshotHandler
that injects aFormatterService
dependency. This constructor will be only used in tests and you production code will continue to use the real singleton instance.public static class DriverSnapshotHandler { private final FormatterService formatter; //used in production code public DriverSnapshotHandler() { this(FormatterService.getInstance()); } //used for tests DriverSnapshotHandler(FormatterService formatter) { this.formatter = formatter; } public String getImageURL() { return formatter.formatTachoIcon(); } }
Then, your test should look like this :
FormatterService formatter = mock(FormatterService.class);
when(formatter.formatTachoIcon()).thenReturn("MockedURL");
DriverSnapshotHandler handler = new DriverSnapshotHandler(formatter);
handler.getImageURL();
verify(formatter, atLeastOnce()).formatTachoIcon();