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:
    • WriterRunner run with Writer (use @ContextConfiguration)
      • WriterRunner object must not be null
      • IWriter object must not be null
      • IWriter is an instance of Writer
      • WriterRunner class's getWriter method return a writer is Writer
    • WriterRunner run with NiceWriter
      • WriterRunner object must not be null
      • IWriter object must not be null
      • IWriter is an instance of NiceWriter
      • WriterRunner class's getWriter method return a writer is NiceWriter
  • Write a mock test to test the case when WriterRunner's run method is called, IWriter's write method 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 WriterRunner class 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");
    }