文件

§使用 Guice 進行測試

如果您使用 Guice 進行依賴注入,則您可以直接設定如何為測試建立元件和應用程式。這包括新增額外的繫結或覆寫現有的繫結。

§GuiceApplicationBuilder

GuiceApplicationBuilder 提供一個建構器 API,用於設定依賴注入和建立Application

§Imports

使用 Guice 建立應用程式時,您需要的主要 import 項目為

import play.Application;
import play.inject.guice.GuiceApplicationBuilder;

§Environment

可以指定Environment,或環境的部分內容,例如應用程式的根路徑、模式或類別載入器。設定好的環境將用於載入應用程式設定檔,它將用於載入模組,並在從 Play 模組衍生繫結時傳遞,而且它可以注入到其他元件中。

Application application =
    new GuiceApplicationBuilder()
        .load(
            new play.api.inject.BuiltinModule(),
            new play.inject.BuiltInModule(),
            new play.api.i18n.I18nModule(),
        .in(new Environment(new File("path/to/app"), classLoader, Mode.TEST))
        .build();
Application application =
    new GuiceApplicationBuilder()
        .load(
            new play.api.inject.BuiltinModule(),
            new play.inject.BuiltInModule(),
            new play.api.i18n.I18nModule(),
        .in(new File("path/to/app"))
        .in(Mode.TEST)
        .in(classLoader)
        .build();

§Configuration

可以新增其他設定檔。此設定檔將永遠新增到自動為應用程式載入的設定檔中。當使用現有的金鑰時,將優先使用新的設定檔。

Config extraConfig = ConfigFactory.parseMap(ImmutableMap.of("a", 1));
Map<String, Object> configMap = ImmutableMap.of("b", 2, "c", "three");

Application application =
    new GuiceApplicationBuilder()
        .configure(extraConfig)
        .configure(configMap)
        .configure("key", "value")
        .build();

也可以覆寫從應用程式環境自動載入設定檔的動作。這將完全取代應用程式設定檔。例如

Application application =
    new GuiceApplicationBuilder()
        .withConfigLoader(env -> ConfigFactory.load(env.classLoader()))
        .build();

§Bindings and Modules

用於依賴注入的繫結可以完全設定。建構器方法支援Play 模組和繫結,以及 Guice 模組。

§Additional bindings

可以透過 Play 模組、Play 繫結或 Guice 模組新增其他繫結

import static play.inject.Bindings.bind;
Application application =
    new GuiceApplicationBuilder()
        .bindings(new ComponentModule())
        .bindings(bind(Component.class).to(DefaultComponent.class))
        .build();

§Override bindings

可以使用提供繫結的 Play 繫結或模組來覆寫繫結。例如

Application application =
    new GuiceApplicationBuilder()
        .overrides(bind(Component.class).to(MockComponent.class))
        .build();

§Disable modules

任何已載入的模組都可以透過類別名稱停用

Application application =
    new GuiceApplicationBuilder()
        .disable(ComponentModule.class)
        .build();

§已載入的模組

模組會根據 play.modules.enabled 設定自動從類別路徑載入。可以覆寫此預設的模組載入。例如

import play.inject.guice.Guiceable;
Application application =
    new GuiceApplicationBuilder()
        .load(
            Guiceable.modules(
                new play.api.inject.BuiltinModule(),
                new play.api.i18n.I18nModule(),
                new play.api.mvc.CookiesModule(),
                new play.inject.BuiltInModule()),
            Guiceable.bindings(bind(Component.class).to(DefaultComponent.class)))
        .build();

§GuiceInjectorBuilder

GuiceInjectorBuilder 提供一個建構器 API,用於更廣泛地設定 Guice 依賴注入。此建構器不會像 GuiceApplicationBuilder 一樣自動從環境載入設定或模組,但會提供一個完全乾淨的狀態,用於新增設定和繫結。可以在 GuiceBuilder 中找到兩個建構器的共用介面。Play Injector 已建立。以下是如何使用注入器建構器建立元件的範例

import play.inject.Injector;
import play.inject.guice.GuiceInjectorBuilder;
import static play.inject.Bindings.bind;
Injector injector =
    new GuiceInjectorBuilder()
        .configure("key", "value")
        .bindings(new ComponentModule())
        .overrides(bind(Component.class).to(MockComponent.class))
        .injector();

Component component = injector.instanceOf(Component.class);

§在功能測試中覆寫繫結

以下是使用模擬元件取代元件進行測試的完整範例。我們從一個元件開始,它有一個預設實作和一個用於測試的模擬實作

public interface Component {
  String hello();
}
public class DefaultComponent implements Component {
  public String hello() {
    return "default";
  }
}
public class MockComponent implements Component {
  public String hello() {
    return "mock";
  }
}

此元件使用模組自動載入

import com.google.inject.AbstractModule;

public class ComponentModule extends AbstractModule {
  protected void configure() {
    bind(Component.class).to(DefaultComponent.class);
  }
}

而且元件是在控制器中使用

import play.mvc.*;
import javax.inject.Inject;
import javax.inject.Singleton;

@Singleton
public class Application extends Controller {

  private final Component component;

  @Inject
  public Application(Component component) {
    this.component = component;
  }

  public Result index() {
    return ok(component.hello());
  }
}

若要建立一個 Application功能測試 中使用,我們可以簡單地覆寫元件的繫結

import play.Application;
import play.inject.guice.GuiceApplicationBuilder;
import static play.inject.Bindings.bind;
Application application =
    new GuiceApplicationBuilder()
        .overrides(bind(Component.class).to(MockComponent.class))
        .build();

此應用程式可以使用測試輔助工具,例如 runningWithApplication

下一步:使用資料庫進行測試


在此文件檔中發現錯誤?此頁面的原始程式碼可以在 這裡 找到。在閱讀 文件檔指南 之後,請隨時提交拉取請求。有問題或建議要分享嗎?前往 我們的社群論壇 與社群展開對話。