Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mocking a class vs. mocking its interface

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?

like image 540
helpermethod Avatar asked Feb 10 '12 10:02

helpermethod


People also ask

Can you mock an interface?

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.

Can we mock class without an interface?

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.

What does mocking a class do?

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.

Is mocking a dependency injection?

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.


1 Answers

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.

like image 189
Kuldeep Jain Avatar answered Sep 23 '22 10:09

Kuldeep Jain