Jus*_*rds 3 java unit-testing dependency-injection playframework
我正在尝试为Play Framework 2.4.6应用程序编写一些单元测试.我需要WS用于我的目的测试.但是,当我使用documentmention的方法注入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
});
}
}
Run Code Online (Sandbox Code Playgroud)
这是运行激活器测试时的控制台输出
[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
Run Code Online (Sandbox Code Playgroud)
我确信我只是从根本上误解了依赖注入或系统如何工作的问题.任何帮助将非常感激.
由于测试应该只关注一个特定的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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当然,ws
如果你愿意,你也可以手动实例化或嘲笑它.
关于它们models
,它们的生命周期不是由Guice处理的,然后,没有直接的方法在模型上进行依赖注入.你总能找到办法做到这一点,但是你呢?如果尝试从数据库加载100个对象然后必须在每个对象中注入依赖项,会发生什么?
除了(可能的)性能问题,也许你在这里也违反了单一责任原则,你的模型正在做很多工作.
归档时间: |
|
查看次数: |
1158 次 |
最近记录: |