I am writing a junit test cases for one of component in spring boot application. That component is having @Valu
e 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;
}
}