Home > Back-end >  Junit 5 mockito unable to read properties file annotated with @Value in spring boot application
Junit 5 mockito unable to read properties file annotated with @Value in spring boot application

Time:10-21

I am writing a junit test cases for one of component in spring boot application. That component is having @Value annotation and reading value from property file.

When I am running my Junit 5 (mockito) and controls goes to the component; the value is null.

What I have tried: I used @ExtendWith(SpringRunner) and changed @injectMocks to @Autowired and @mock to @MockBeans, but that is not I want (As its became integration test.)

Junit class:

@ExtendWith(MockitoExtension.class)
public class ItemMessageProcessorTest {

    private static final String VALUE1 = "Value 1";
    private static final String VALUE2 = "Value 2";
    private static final String VALUE3 = "Value 3";

    @InjectMocks
    private MyComponent component;

    

Component class:

@Slf4j
@Component
public class MyComponent {

    @Value("${my-val.second-val.final-val}")
    private String myValue;

This myValue is being used here in the same component class:

 public void myMethod(){
    myObject.setMyValue(Integer.parseInt(myValue));
}

What I was looking for is something like: If I can by any chance mock the parseInt, or load the values from test class itself. Any lead would be a great help. Note: I can't change anything in the component class.

CodePudding user response:

You can just use Spring reflection utills method for setting the field value with @Value for unit test:

org.springframework.test.util.ReflectionTestUtils.setField(classUnderTest, "field", "value");

CodePudding user response:

I would go for constructor injection in this case:

@Slf4j
@Component
public class MyComponent {

    private final String myValue;

    MyComponent(@Value("${my-val.second-val.final-val}" String myValue)) {
        this.myValue = myValue;
    }
}
  • Related