Injecting a String property with @InjectMocks Injecting a String property with @InjectMocks spring spring

Injecting a String property with @InjectMocks


You can't do this with Mockito, but Apache Commons actually has a way to do this using one of its built in utilities. You can put this in a function in JUnit that is run after Mockito injects the rest of the mocks but before your test cases run, like this:

@InjectMocksMyClass myClass;@Beforepublic void before() throws Exception {    FieldUtils.writeField(myClass, "fieldName", fieldValue, true);}


You cannot do this with Mockito, because, as you mentioned yourself, a String is final and cannot be mocked.

There is a @Spy annotation which works on real objects, but it has the same limitations as @Mock, thus you cannot spy on a String.

There is no annotation to tell Mockito to just inject that value without doing any mocking or spying. It would be a good feature, though. Perhaps suggest it at the Mockito Github repository.

You will have to manually instantiate your controller if you don't want to change your code.

The only way to have a pure annotation based test is to refactor the controller. It can use a custom object that just contains that one property, or perhaps a configuration class with multiple properties.

@Componentpublic class MyProperty {    @Value("${my.property}")    private String myProperty;    ...}

This can be injected into the controller.

@Autowiredpublic AbcController(XyzService xyzService, MyProperty myProperty) {     ... }

You can mock and inject this then.

@RunWith(MockitoJUnitRunner.class)public class AbcControllerTest {    @Mock    private XyzService mockXyzService;    @Mock    private MyProperty myProperty;    @InjectMocks    private AbcController controllerUnderTest;    @Before    public void setUp(){        when(myProperty.get()).thenReturn("my property value");    }    /* tests */}

This is not pretty straight forward, but at least you will be able to have a pure annotation based test with a little bit of stubbing.


Since you're using Spring, you can use the org.springframework.test.util.ReflectionTestUtils from the spring-test module. It neatly wraps setting a field on a object or a static field on a class (along with other utility methods).

@RunWith(MockitoJUnitRunner.class)public class AbcControllerTest {    @Mock    private XyzService mockXyzService;    @InjectMocks    private AbcController controllerUnderTest;    @Before    public void setUp() {        ReflectionTestUtils.setField(controllerUnderTest, "myProperty",                "String you want to inject");    }    /* tests */}