依赖注入在Play Framework 2.4.x中的模型或测试中不起作用

时间:2016-01-21 18:56:32

标签: java unit-testing playframework dependency-injection

我正在尝试为Play Framework 2.4.6应用程序编写一些单元测试。我需要WS用于我的目的测试。但是,当我使用文档的方法来注入WS时,如果在测试或模型中使用,我最终会得到一个空指针。但是,如果我将其安装到我的一个控制器中,则注入效果非常好。

这是我的测试:

import org.junit.Test;
import play.test.WithServer;
import play.libs.ws.*;
import javax.inject.Inject;
import static play.test.Helpers.running;
import static play.test.Helpers.testServer;

public class UserProfileTests extends WithServer {
    @Inject
    WSClient ws;

    @Test
    public void demographicTest() {

        System.out.println(ws.toString()); //null pointer exception

        running(testServer(3333), () -> {
            System.out.println(ws.toString()); //null pointer exception
        });

    }
}

这是运行激活器测试时的控制台输出

[error] Test UserProfileTests.demographicTest failed: java.lang.NullPointerException: null, took 5.291 sec
[error]     at UserProfileTests.demographicTest(UserProfileTests.java:15)
[error]     ...
[error] Failed: Total 4, Failed 1, Errors 0, Passed 3
[error] Failed tests:
[error]     UserProfileTests
[error] (test:test) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 9 s, completed Jan 21, 2016 11:54:49 AM

我确定我从根本上误解了依赖注入或系统如何工作的问题。任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:5)

由于测试应该只关注一个特定的scanario / object,我认为你不必担心如何为你的测试做依赖注入,而只需要实例化你需要的东西。以下是使用应用程序Injector进行实例化的方法:

import org.junit.Before;
import org.junit.Test;
import play.libs.ws.WSClient;
import play.test.WithServer;

public class UserProfileTests extends WithServer {

    private WSClient ws;

    @Before
    public void injectWs() {
        ws = app.injector().instanceOf(WSClient.class);
    }

    @Test
    public void demographicTest() {
        System.out.println(ws);
    }
}

但是,当然,您也可以手动实例化ws或者根据需要嘲笑它。

关于models,他们的生命周期不是由Guice处理的,然后,在模型上没有直接的方法来执行依赖注入。你总能找到办法做到这一点,但是你呢?如果尝试从数据库加载100个对象,然后必须在每个对象中注入依赖项,会发生什么?

除了(可能的)性能问题之外,您可能也违反了Single Responsibility Principle,而且您的模型正在做很多工作。