Java 如何在控制器测试中注入依赖项?
这是我的类及其构造函数和依赖项Java 如何在控制器测试中注入依赖项?,java,playframework,Java,Playframework,这是我的类及其构造函数和依赖项 public class FavouriteProfilesController extends BaseController implements CurrentUser, JsonHelper { private final UserProvider userProvider; private MessagesApi msg; @javax.inject.Inject public FavouriteProfilesCont
public class FavouriteProfilesController extends BaseController implements CurrentUser, JsonHelper {
private final UserProvider userProvider;
private MessagesApi msg;
@javax.inject.Inject
public FavouriteProfilesController(
UserProvider userProvider,
MessagesApi msgApi) {
this.userProvider = userProvider;
this.msg = msgApi;
}
// methods etc...
这是我刚从文档中复制的测试代码:
public class FavouriteProfilesControllerTest extends WithApplication {
@Override
protected Application provideApplication() {
return new GuiceApplicationBuilder()
.configure("play.http.router", "javaguide.tests.Routes")
.build();
}
@Test
public void testIndex() {
Result result = new FavouriteProfilesController().index(); // Inject dependencies here
assertEquals(OK, result.status());
assertEquals("text/html", result.contentType().get());
assertEquals("utf-8", result.charset().get());
assertTrue(contentAsString(result).contains("Welcome"));
}
}
控制器有两个依赖项,UserProvider和MessagesApi,如何将它们注入/模拟到控制器测试中 如果您使用Mockito,您可以这样模拟它们:
@RunWith(MockitoJUnitRunner.class)
public class FavouriteProfilesControllerTest extends WithApplication {
@InjectMocks
private FavouriteProfilesController controller;
@Mock
private UserProvider userProvider;
@Mock
private MessagesApi msg;
@Test
public void test() {
Assert.assertNotNull(userProvider);
Assert.asserNotNull(msg);
}
}
public class FavouriteProfilesControllerTest extends WithApplication {
@Test
public void testIndex() {
running(Helpers.fakeApplication(), () -> {
RequestBuilder mockActionRequest = Helpers.fakeRequest(
controllers.routes.FavouriteProfilesController.index());
Result result = Helpers.route(mockActionRequest);
assertEquals(OK, result.status());
assertEquals("text/html", result.contentType().get());
assertEquals("utf-8", result.charset().get());
assertTrue(contentAsString(result).contains("Welcome"));
});
}
}
解决方案取决于您打算测试的内容。如果您想模拟UserProvider和MessageApi的整个行为,那么使用Mockito可能是一个合适的解决方案。 如果您想用真实对象测试控制器功能,则需要注入真实对象。可以这样做:
@RunWith(MockitoJUnitRunner.class)
public class FavouriteProfilesControllerTest extends WithApplication {
@InjectMocks
private FavouriteProfilesController controller;
@Mock
private UserProvider userProvider;
@Mock
private MessagesApi msg;
@Test
public void test() {
Assert.assertNotNull(userProvider);
Assert.asserNotNull(msg);
}
}
public class FavouriteProfilesControllerTest extends WithApplication {
@Test
public void testIndex() {
running(Helpers.fakeApplication(), () -> {
RequestBuilder mockActionRequest = Helpers.fakeRequest(
controllers.routes.FavouriteProfilesController.index());
Result result = Helpers.route(mockActionRequest);
assertEquals(OK, result.status());
assertEquals("text/html", result.contentType().get());
assertEquals("utf-8", result.charset().get());
assertTrue(contentAsString(result).contains("Welcome"));
});
}
}
如果您不打算在测试中使用不同的注入绑定,则不需要使用GuiceApplicationBuilder。调用Helpers.fakeApplication()调用默认依赖项注入
您可以在游戏中找到有关单元测试的更多信息。谢谢,我会在家里尝试。