Mockito Inject mocks Spy

I am writing a test case for a class that has 2 levels of dependency injection. I am using the @Spy annotation for a Level 1 dependency injection object, and I would like a Mock Level 2 injection. However, I continued to get a null pointer exception at the 2nd level. Is there any way that I am inserting a mock into an @Spy object?

public class CarTestCase{
    @Mock
    private Configuration configuration;

    @Spy 
    private Engine engine;

    @InjectMocks 
    private Car car;

    @Test
    public void test(){

       Mockito.when(configuration.getProperties("")).return("Something");
       car.drive();
    }

}

public class Car{
    @Inject
    private Engine engine;

    public void drive(){
        engine.start();
    }
}

public class Engine{
    @Inject 
    private Configuration configuration;

    public void start(){
        configuration.getProperties();   // null pointer exception
    }

}
+4
source share
1 answer

Mockito cannot perform such tricky injections as this is not an injection frame. So, you need to reorganize your code to make it more verifiable. This is easy to do using constructor injection:

public class Engine{
    private Configuration configuration;

    @Inject 
    public Engine(Configuration configuration) {
        this.configuration = configuration;
    }
    ........
}

public class Car{
    private Engine engine;

    @Inject    
    public Car(Engine engine) {
        this.engine = engine;
    }
}

:

public class CarTestCase{

    private Configuration configuration;

    private Engine engine;

    private Car car;

    @Before
    public void setUp(){
        configuration = mock(Configuration.class);
        engine = spy(new Engine(configuration));
        car = new Car(engine);
    }

    @Test
    public void test(){

       Mockito.when(configuration.getProperties("")).return("Something");
       car.drive();
    }

}
+3

Source: https://habr.com/ru/post/1676966/


All Articles