In a .NET windows app, I have a class named EmployeeManager. On instantiation, this class loads employees into a List from the database that haven’t completed registration. I’d like to use EmployeeManager in unit test. However, I don’t want to involve the database.
From what I understand about this scenario, I need an IEmployeeManager interface, which is only used for testing purposes. This doesn’t seem right since the interface has no other use. However, it will allow me to create some EmployeeManager test class that loads employees without involving the database. This way, I can assign values that would have otherwise come from the database.
Is the above correct and do I need to Mock it? Mocking (Moq framework) seems to use lots of code just to do simple things such as assigning a property. I don’t get the point. Why mock when I can just create a simple test class from IEmployeeManager that will provide what I need?
It’s well worth creating the interface. Note also that the interface actually has multiple purposes:
EmployeeManager. By using an interface you’re preventing an accidental dependency on something database specific.EmployeeManager, you’re free to swap out its implementation without needing to recompile the rest of the application. Of course, this depends on project structure, number of assemblies, etc., but it nevertheless allows this type of reuse.As one poster pointed out, it sounds like you’re talking about creating a stub test class. Mocking frameworks can be used to create stubs, but one of the most important features about them is that they allow you to test behavior instead of state. Now let’s look at some examples. Assume the following:
When we test the
HiringOfficer‘sHireEmployeebehavior, we’re interested in validating that he correctly communicated to the employee manager that this perspective employee be added as an employee. You’ll often see something like this:The above test is reasonable… but not good. It’s a state-based test. That is, it verifies the behavior by checking the state before and after some action. Sometimes this is the only way to test things; sometimes it’s the best way to test something.
But, testing behavior is often better, and this is where mocking frameworks shine:
In the above we tested the only thing that really mattered — that the hiring officer communicated to the employee manager that a new employee needed to be added (once, and only once… though I actually wouldn’t bother checking the count in this case). Not only that, I validated that the employee that I asked the hiring officer to hire was added by the employee manager. I’ve tested the critical behavior. I didn’t need even a simple test stub. My test was shorter. The actual behavior was much more evident — it becomes possible to see the interaction and validate interaction between objects.
It is possible to make your stub test class record interactions, but then you’re emulating the mocking frameworks. If you’re going to test behavior — use a mocking framework.
As another poster mentioned, dependency injection (DI) and inversion of control (IoC) are important. My example above isn’t a good example of this, but both should be carefully considered and judiciously used. There’s a lot of writing on the subject available.
1 – Yes, thinking is still optional, but I’d strongly recommend it ;).