For a unit test, I need to mock several dependencies. One of the dependencies is a class which implements an interface:
public class DataAccessImpl implements DataAccess { ... }
I need to set up a mock object of this class which returns some specified values when provided with some specified parameters.
Now, what I'm not sure of, is if it's better to mock the interface or the class, i.e.
DataAccess client = mock(DataAccess.class);
vs.
DataAccess client = mock(DataAccessImpl.class);
Does it make any difference in regard to testing? What would be the preferred approach?
The Mockito. mock() method allows us to create a mock object of a class or an interface. We can then use the mock to stub return values for its methods and verify if they were called.
Because of this, you can only mock interfaces, or virtual methods on concrete or abstract classes. Additionally, if you're mocking a concrete class, you almost always need to provide a parameterless constructor so that the mocking framework knows how to instantiate the class.
Mocking is done when you invoke methods of a class that has external communication like database calls or rest calls. Through mocking you can explicitly define the return value of methods without actually executing the steps of the method.
Dependency injection is a way to scale the mocking approach. If a lot of use cases are relying on the interaction you'd like to mock, then it makes sense to invest in dependency injection. Systems that lend themselves easily to dependency injection: An authentication/authorization service.
It may not make much difference in your case but the preferred approach is to mock interface, as normally if you follow TDD (Test Driven Development) then you could write your unit tests even before you write your implementation classes. Thus even if you did not have concrete class DataAccessImpl
, you could still write unit tests using your interface DataAccess
.
Moreover mocking frameworks have limitations in mocking classes, and some frameworks only mock interfaces by default.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With