§使用 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();
此應用程式可以使用測試輔助工具,例如 running
和 WithApplication
。
下一步:使用資料庫進行測試
在此文件檔中發現錯誤?此頁面的原始程式碼可以在 這裡 找到。在閱讀 文件檔指南 之後,請隨時提交拉取請求。有問題或建議要分享嗎?前往 我們的社群論壇 與社群展開對話。