JUnit 使用本地化测试 Vaadin 23 元素

JUnit testing Vaadin 23 elements using localization

我不想让 JUnit 测试我使用 Vaadin 本地化的布局,但我遇到错误:

public class CallSearchFilters2 extends HorizontalLayout {
  private Binder<SearchQueryFormDTO> binder = new Binder<>(SearchQueryFormDTO.class);
  protected TextField participantName;
  public CallSearchFilters2() {
    participantName = new TextField(getTranslation("quickSearch.name"));
   // participantName = new TextField("Name");
    participantName.setClearButtonVisible(true);
    participantName.setHelperText("For partial search use %");
    binder.forField(participantName).bind(SearchQueryFormDTO::getName, SearchQueryFormDTO::setName);
    add(participantName);
    binder.addValueChangeListener(valueChangeEvent -> fireEvent(new FilterChangedEvent(this, false)));
  }...
public void loadFromDTO(SearchQueryFormDTO dto) {binder.readBean(dto);}
}

我的 JUnit 测试:

  @Test
  public void loadFromSearchQuery() {
    final String name = "NAME";
    SearchQueryFormDTO dto = new SearchQueryFormDTO();
    dto.setName(name);
    CallSearchFilters2 callSearchFilters = new CallSearchFilters2();
    callSearchFilters.loadFromDTO(dto);
    Assert.assertEquals(name, callSearchFilters.participantName.getValue());
  }

我在 运行 测试时遇到此错误:

java.lang.NullPointerException: Cannot invoke "com.vaadin.flow.server.VaadinService.getInstantiator()" because the return value of "com.vaadin.flow.server.VaadinService.getCurrent()" is null

如果我不使用“getTransaltion”,我的测试是 运行 和绿色。

Class 测试中的 CallSearchFilters2 包含一个 TextField,您可以将其添加到布局中。如果不模拟几个 Vaadin 类,这将无法在单元测试中工作,这些 Vaadin 需要到位,例如layout.add(..) 开始工作。 VaadinService、VaadinSession 和 UI 是其中的一部分,但实际上还需要其他一些 类。由于从头开始这样做很乏味,我建议您检查一下您是否想使用 Karibu 库(本质上就是为您提供这个模拟)。

https://github.com/mvysny/karibu-testing

工作解决方案:

package com.tcandc.carin.webui.next.views.callsearch;

import com.github.mvysny.kaributesting.v10.MockVaadin;
import com.github.mvysny.kaributesting.v10.Routes;
import com.vaadin.flow.component.UI;
import kotlin.jvm.functions.Function0;
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class CallSearchFiltersTest2 {

  private static Routes routes;

  @BeforeAll
  public static void createRoutes() {
    routes = new Routes().autoDiscoverViews("com.tcandc.carin.webui.next");
  }

  @BeforeEach
  public void setupVaadin() {
    final Function0<UI> uiFactory = UI::new;
    MockVaadin.setup(routes, uiFactory);
  }

  @Test
  public void loadFromSearchQuery() {
    final String name = "NAME";
    SearchQueryFormDTO dto = new SearchQueryFormDTO();
    dto.setName(name);
    CallSearchFilters2 callSearchFilters = new CallSearchFilters2();
    callSearchFilters.loadFromDTO(dto);
    Assert.assertEquals(name, callSearchFilters.participantName.getValue());
  }

}