Весеннее пакетное тестирование - Autowired bean имеет значение null - PullRequest
1 голос
/ 14 июля 2020

Я совершенно в тупике. Я новичок в тестировании Spring Batch, и я нашел бесчисленное количество примеров, которые сбили меня с толку.

Я пытаюсь протестировать решение Spring Batch. Этот решающий механизм проверяет, существуют ли определенные файлы JSON, прежде чем продолжить.

Для начала у меня есть файл BatchConfiguration , помеченный @Configuration в моем проекте Spring Batch.

В BatchConfiguration у меня есть bean-компонент ImportJsonSettings , который загружает свои свойства из настроек в файле application.properties .

  @ConfigurationProperties(prefix="jsonfile")
    @Bean
    public ImportJSONSettings importJSONSettings(){
        return new ImportJSONSettings();
    }

При запуске приложения Spring Batch , это работает отлично.

Далее, вот основы JsonFilesExistDecider , который автоматически подключает объект FileRetriever ...

public class JsonFilesExistDecider implements JobExecutionDecider {

    @Autowired
    FileRetriever fileRetriever;

    @Override
    public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) { ... }

The FileRetriever * Сам объект 1024 * Автоматически подключает объект ImportJSONSettings .

Вот FileRetriever ...

@Component("fileRetriever")
public class FileRetriever {

    @Autowired
    private ImportJSONSettings importJSONSettings;

    private File fieldsFile = null;

    public File getFieldsJsonFile(){
        if(this.fieldsFile == null) {
            this.fieldsFile = new File(this.importJSONSettings.getFieldsFile());
        }
        return this.fieldsFile;
    }
}

Теперь тестовый файл. Я использую Mockito для тестирования.

public class JsonFilesExistDeciderTest {
    @Mock
    FileRetriever fileRetriever;
    @InjectMocks
    JsonFilesExistDecider jsonFilesExistDecider;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
    @Test
    public void testDecide() throws Exception {
        when(fileRetriever.getFieldsJsonFile()).thenReturn(new File(getClass().getResource("/com/files/json/fields.json").getFile()));

        // call decide()... then Assert...
    }
}

ПРОБЛЕМА ... Объект ImportJSONSettings , который является @Autowired в объекте FileRetriever , всегда имеет значение NULL.

При вызове метода testDecide () я получаю NPE, так как при вызове getFieldsJsonFile () в FileRetriever bean ImportJSONSettings не существует.

Каким образом bean-компонент ImportJSONSettings правильно создается в объекте FileRetriever , чтобы его можно было использовать ??

Я попытался добавить следующее в свой тестовый класс, но не помогает.

@Mock
ImportJSONSettings importJSONSettings;

Надо ли создавать его самостоятельно? Как он вводится в FileRetriever?

Любая помощь приветствуется.

1 Ответ

1 голос
/ 15 июля 2020

Попробуйте изменить аннотацию @Before в методе setup() на @BeforeEach, например:

@BeforeEach
void setup() {
    MockitoAnnotations.initMocks(this);
}

Это также может быть проблемой зависимости. Убедитесь, что у вас установлена ​​последняя версия io.micrometer:micrometer-core. Сможете ли вы поделиться своими тестовыми зависимостями?

Если вы правильно настроили указанную выше настройку, вам не нужно беспокоиться о том, является ли ImportJSONSettings нулевым или нет, если у вас есть getFieldsJsonFile() прошился правильно.

...