Как установить значение, введенное Spring в модульном тесте? - PullRequest
1 голос
/ 28 января 2020

Я пишу модульный тест для следующего класса, который управляется Spring:

@Component
public class MyClass {
    @Value("${urlValue}")
    private String urlPath;
    private MyUrl url = new MyUrl(urlPath);

    public class MyUrl {
        MyUrl(String url) {
            if (url == null) {
                throw new NullPointerException();
            }
        }
    }
}

Я пытаюсь установить urlValue самым простым способом для моего теста. Я попробовал следующее:

public class MyClassTest {
    private MyClass mc;

    @Before
    public void setUp() {
        mc = new MyClass();
        ReflectionTestUtils.setField(mc, "urlPath", "urlValue");
    }

    @Test
    public void test() {

    }
}

Однако настройка по отражению не удалась, потому что она приходит слишком поздно (new MyUrl() вызывается раньше и выдает исключение). Какой самый простой способ установить urlPath, в идеале (я полагаю), без изменения кода или использования контекста Spring для теста?

Ответы [ 2 ]

1 голос
/ 28 января 2020

Для модульного тестирования компонента Spring вам необходимо настроить его элементы извне. Самый простой способ сделать это - использовать инжектор конструктора. Внедрение поля требует от вас запуска @SpringBootTest, что делает ваш модульный тест неоправданно медленным, так как создает контекст Spring.

Посмотрите здесь: Руководство по модульному тестированию при весенней загрузке

Вы можете сделать это так (не проверялось на правильность):

@Component
public class MyClass {
    private String urlPath;
    private MyUrl url;

    public MyClass(@Value("${urlValue}") String urlPath) {
        this.urlPath = urlPath;
        this.url = new MyUrl(urlPath)
    }

    public class MyUrl {
        MyUrl(String url) {
            if (url == null) {
                throw new NullPointerException();
            }
        }
    }
}
0 голосов
/ 30 января 2020

https://github.com/exabrial/mockito-object-injection

Мы создали расширение JUnit для решения именно этой проблемы.

Легко использовать ... см. README.md:

@TestInstance(Lifecycle.PER_CLASS)
@ExtendWith({ MockitoExtension.class, InjectMapExtension.class })
public class MyControllerTest {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...