Передача поля свойств с использованием аннотации @value для mocked-метода - null - PullRequest
0 голосов
/ 04 ноября 2018

Я не могу передать поле, прочитав файл application-test.properties из теста в проверенный метод.

@RunWith(SpringRunner.class)
@TestPropertySource("classpath:application-test.properties")
public class ReportImplTest {
    @Mock
    private Dependencies dependencies;

    @InjectMocks
    private ReportImplTest  underTest;

   @Test
    public void testgetReports() {
         List<String> reps= underTest.getReports(anyString());
    }

}

Вот фактический класс смоделированного метода

@Component
public class ReportImpl {

    @Value("${REP_PROPNAME}")
    String reppropname;

    public List<String> getReports(String rep){

      return staticUtilityclass.process(staticUtilityclass.transform(reppropname,"Reports"));
    }

}

в методе getReports повторное имя равно нулю. Тест выполняется в контексте теста, где класс ReportImpl будет в контексте приложения. Есть ли способ получить значение reppropname. Я пытался использовать @ContextConfiguration (@ContextConfiguration(classes={ApplicaitonBootStarter.class)} он работает, но загружает все компоненты и зависимости. Есть ли другой способ получить повторное имя?

1 Ответ

0 голосов
/ 05 ноября 2018

Причина, по которой значение здесь не вводится, заключается в том, что вы не предоставляете конфигурацию для своего тестового класса. Весна просто не знает, как создать свой боб. Итак, как вы упомянули, вы должны аннотировать тестовый класс @ContextConfiguration. Если вы не хотите создавать весь контекст со всеми bean-компонентами, вы можете создать тестовую конфигурацию и предоставить туда только необходимые bean-компоненты.

@Configuration //can be as well annotated with @TestConfiguration
@ComponentScan("package.to.scan")
public class TestConfiguration {
}

А теперь предоставьте этот класс для вашего теста

@RunWith(SpringRunner.class)
@TestPropertySource("classpath:application-test.properties")
@ContextConfiguration(classes = TestConfiguration.class)
public class ReportImplTest {
........
}

Но есть еще одна вещь. Предполагая, что у вас есть метод @Before, который выполняет MockitAnnotations.initMocks(this);, у вас все еще есть тестируемый объект, объявленный только с @InjectMocks. Что это значит? Это означает, что если вы не инициализируете этот объект самостоятельно, mockito позаботится о нем и инициализируется с использованием доступного конструктора, и в этом случае Spring не будет внедрять аннотированное поле @Value. Что вам нужно сделать, так это пометить тестируемый объект с помощью @Autowired, чтобы Spring инициализировал его, прежде чем mockito попытается позаботиться о нем:

@InjectMocks
@Autowired
private ReportImplTest  underTest;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...