Вложенное автоматическое поле остается пустым в тесте JUNIT - PullRequest
3 голосов
/ 28 июня 2019

У меня реализован шаблон фабрики, и я хотел это проверить.За исключением того, что поля в этом заводском методе не получают автосвязь.Кажется, что атрибут @Autowired в фабричном классе остается нулевым. Я не могу использовать аннотацию @SpringBootTest из-за загружаемого затем файла конфигурации цепочки блоков

Ниже приведен код фабрики сервисов, парсерный завод автоматически подключается в тесте.Проблемы с автопроводными полями парсерфабрики

@Service
@Slf4j
public class ParserFactory {

    @Autowired
    OsirisParser osirisParser;

    public Parser getParser(String system) {
        if (system == null) {
            return null;
        }
        if (system.equalsIgnoreCase("Progress")) {
            return ProgressCreateService();
        }
        if (system.equalsIgnoreCase("Osiris")) {
            log.debug("Osiris parsen creëren");
            return OsirisCreateService();
        }
        return null;

    }

    public OsirisParser OsirisCreateService() {
        return osirisParser;
    }

    public OsirisParser ProgressCreateService() {
        return new OsirisParser("ProgressParser");
    }

Тест

@RunWith(SpringRunner.class)
public class FactoryTest {

    @Mock
    ParserFactory serviceCallFactory;

    @Test
    public void testCreateOsirisServiceSuccesFull() {
        Parser serv = serviceCallFactory.getParser("Osiris");
        assertThat(serv, instanceOf(OsirisParser.class));
    }

    @Test
    public void testCreateProgressServiceSuccesFull()  {
        Parser serv = serviceCallFactory.getParser("Progress");
        assertThat(serv, instanceOf(ProgressParser.class));
    }

    @Test
    public void testCreateProgressServiceUnSuccessFull() {
        Parser serv = serviceCallFactory.getParser("Progrddess");
        assertThat(serv, is(not(instanceOf(OsirisParser.class))));
    }

    @Test
    public void testCreateWhenStringIsNotCorrect() {
        Parser serv = serviceCallFactory.getParser("0$iri$");
        assertThat(serv, is(nullValue()));
    }

    @Test
    public void testCreateWhenStringIsNull() {
        Parser serv = serviceCallFactory.getParser("");
        assertThat(serv,  is(nullValue()));
    }
}

1 Ответ

1 голос
/ 28 июня 2019

У вас нет пружинного контекста в вашем тестовом классе, что означает, что вы тестируете POJO без пружинной инициализации, поэтому автоматическое подключение не происходит и поле имеет значение null.

ЕстьЕсть несколько способов ее решения:

  • Если вы хотите проверить его как POJO, установите поле в тестируемом классе.вы можете использовать @InjectMocks, ReflectionTestUtils.setField в вашей текущей реализации или переместить @Autowire в конструктор или установщик и создать класс в тесте с полем.Я голосую за автоматическое подключение к конструктору

  • Если вы хотите, чтобы он был протестирован как компонент пружины, определите @TestConfiguration, и там либо импортируйте вашу реальную конфигурацию, либо переопределите бины, которые вы используетене хотите использовать или использовать совершенно другую конфигурацию пружины для теста.

В любом случае, выберите тот, который подходит вам больше

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