Unit test with Mock - Tuong-Nguyen/Spring GitHub Wiki
Setup
Use junit and mockito https://github.com/Tuong-Nguyen/Spring/wiki/Dependency-injection-practice-and-unit-test#setup
Example
There is a WriterRunner class that depended on IWriter interface. We need to test run method of WriterRunner class and check if it called write method of IWriter or not.

Expectation
- Apply dependency injection
- Use
@Autowired - There are test classes with test cases:
WriterRunnerrun withWriter(use@ContextConfiguration)WriterRunnerobject must not be nullIWriterobject must not be nullIWriteris an instance ofWriterWriterRunnerclass'sgetWritermethod return a writer isWriter
WriterRunnerrun withNiceWriterWriterRunnerobject must not be nullIWriterobject must not be nullIWriteris an instance ofNiceWriterWriterRunnerclass'sgetWritermethod return a writer isNiceWriter
- Write a mock test to test the case when WriterRunner's
runmethod is called, IWriter'swritemethod is also called.
Manual mock test
By this way, we need to mock IWriter and inject it to WriterRunner manually.
- Mock dependency interface
IWriter
IWriter mockWriter = mock(IWriter.class);
- Inject to
WriterRunnerclass via constructure
WriterRunner myDI = new WriterRunner(mockWriter);
Test code
@Test
public void run_IWriter_WriteWasCalled(){
IWriter mockWriter = mock(IWriter.class);
WriterRunner myDI = new WriterRunner(mockWriter);
myDI.run();
verify(mockWriter, times(1)).write("This is my test");
}
Auto inject and test mock
Use this way, we just use annotation to define what is mock object and what is injected mock object
- Define dependency mock object
Writer
@Mock
private IWriter writer;
- Define injected mock object
WriterRunner
@InjectMocks
private WriterRunner writerRunner;
Test code
@Test
public void run_MockWriter_WriteWasCalled(){
writerRunner.run();
verify(writer, times(1)).write("This is my test");
}