Unit-тесты views в add-ons

Добрый день,

Пробую писать unit-тесты для views в add-on (версия jmix 2.0.2). При запуске теста получаю ошибку “Failed to instantiate [io.jmix.flowui.view.DefaultMainViewParent]”.

Stacktrace:

Failed to instantiate [io.jmix.flowui.view.DefaultMainViewParent]: Specified class is an interface
org.springframework.beans.BeanInstantiationException: Failed to instantiate [io.jmix.flowui.view.DefaultMainViewParent]: Specified class is an interface
	at app//org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:76)
	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1308)
	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1199)
	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560)
	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520)
	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:320)
	at app//com.vaadin.flow.spring.SpringInstantiator.getOrCreate(SpringInstantiator.java:121)
	at app//io.jmix.flowui.sys.vaadin.JmixSpringInstantiator.getOrCreate(JmixSpringInstantiator.java:42)
	at app//com.vaadin.flow.di.Instantiator.createRouteTarget(Instantiator.java:136)
	at app//com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.lambda$getRouteTarget$1(AbstractNavigationStateRenderer.java:133)
	at java.base@17.0.8.1/java.util.Optional.orElseGet(Optional.java:364)
	at app//com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.getRouteTarget(AbstractNavigationStateRenderer.java:132)
	at app//com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.sendBeforeEnterEventAndPopulateChain(AbstractNavigationStateRenderer.java:493)
	at app//com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.createChainIfEmptyAndExecuteBeforeEnterNavigation(AbstractNavigationStateRenderer.java:474)
	at app//com.vaadin.flow.router.internal.AbstractNavigationStateRenderer.handle(AbstractNavigationStateRenderer.java:212)
	at app//com.vaadin.flow.component.internal.JavaScriptNavigationStateRenderer.handle(JavaScriptNavigationStateRenderer.java:78)
	at app//com.vaadin.flow.component.UI.handleNavigation(UI.java:1785)
	at app//com.vaadin.flow.component.UI.navigate(UI.java:1170)
	at app//io.jmix.flowui.view.navigation.ViewNavigationSupport.navigate(ViewNavigationSupport.java:56)
	at app//io.jmix.flowui.testassist.navigation.ViewNavigationDelegate.processNavigation(ViewNavigationDelegate.java:77)
	at app//io.jmix.flowui.testassist.navigation.TestViewNavigationProcessor.processNavigation(TestViewNavigationProcessor.java:59)
	at app//io.jmix.flowui.testassist.navigation.TestViewNavigationProcessor.processNavigation(TestViewNavigationProcessor.java:41)
	at app//io.jmix.flowui.view.navigation.AbstractViewNavigator.navigate(AbstractViewNavigator.java:143)
	at app//com.company.jmix_flowui_addon.view.TestViewTest.testNavigate(TestViewTest.java:23)

Код теста:

@UiTest
@SpringBootTest(classes = {SbConfiguration.class, FlowuiTestAssistConfiguration.class})
public class TestViewTest {

    @Autowired
    ViewNavigators viewNavigators;

    @Test
    void testNavigate() {
        viewNavigators.view(TestView.class).navigate();
        var testView = UiTestUtils.<TestView>getCurrentView();
        assertTrue(testView.isVisible());
    }

}

Как я понимаю, проблема в том, что в JmixUiTestExtension не реализована поддержка DefaultMainViewParent. Если расширить JmixUiTestExtension и добавить специальную обработку DefaultMainViewParent (аналогично методу ViewRegistry#getParentChain) тесты проходят корректно.

Добрый день.

Хорошее замечание, создал тикет на поддержку UI тестов в аддонах: UiTests support in add-ons · Issue #2219 · jmix-framework/jmix · GitHub
Спасибо за информацию.

С уважением,
Дмитрий

1 симпатия

В продолжении темы тестирования UI аддонов.
Задавал вопрос в чат Jmix Community, посоветовали добавить сообщение на форум.

Вопрос по тестированию UI в аддонах jmix2.
На сколько я понимаю поддержка тестирования UI для аддонов на текущий до конца не реализована.

  1. Есть ошибка Failed to instantiate [io.jmix.flowui.view.DefaultMainViewParent]
    На форуме есть топик, создан тикет на фикс проблемы.
    Обойти можно, реализовав “костыль” в виде бина со своей имплементацией DefaultMainViewParent.

  2. Но тогда получаем ошибку Factory method ‘securityFilterChain’ threw exception with message: View ‘login’ is not defined
    Ее можно тоже обойти, если в классе конфигурации прописать @EnableAutoConfiguration(exclude = SecurityFlowuiAutoConfiguration.class)

  3. Тогда можно наконец добраться до тестов UI, которые работают, в части перехода по экранам, поиска компонентов по id и т.д.
    Но если я хочу проверить возможность создания новых объектов, то на этапе эмуляции нажания кнопки сохранения создания сущности - saveAndCloseBtn.click();
    Возникает ошибка - resource: emp_Calendar, type: entity, action: create
    io.jmix.core.security.AccessDeniedException: resource: emp_Calendar, type: entity, action: create

По security - были попытки тестирования аддона независимо от аддона где лежит сам user, loginView и т.д. При добавлении зависимости на аддон с юзерами, там уже другие бины не находились системой (например Notifications)

Добрый день!

  1. Да, пока только делать с обходным решением. Постараемся поправить в июньском релизе.

  2. Вам секурити нужна для бизнес функциональности или только для тестов в аддоне? Если второе, то в тестах достаточно использовать “базовую” секурити конфигурацию:

@SpringBootConfiguration
@EnableAutoConfiguration
@Import({TstadConfiguration.class, FlowuiTestAssistConfiguration.class,})
@PropertySource("classpath:/com/company/testaddon/test-app.properties")
@JmixModule(id = "com.company.testaddon.test", dependsOn = TstadConfiguration.class)
public class TstadTestConfiguration {

    @Bean
    @Primary
    DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
                .generateUniqueName(true)
                .setType(EmbeddedDatabaseType.HSQL)
                .build();
    }

    @EnableWebSecurity
    protected class CoreSecurity extends CoreSecurityConfiguration {
    }
}

Пример аддона с UI тестами без секурити: test-addon-2-2-3.zip (318.1 КБ)

Тут надо смотреть конфигурацию тестов. Если есть возможность поделиться примером, можем посмотреть что не так.