gpt4 book ai didi

java - Jersey 2 将依赖项注入(inject)单元测试

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:07:57 26 4
gpt4 key购买 nike

我有一个这样的 Controller

@Path("/")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class AccountController implements CRUDController<Long, Account> {

private AccountDao accountDao;
private AccountService accountService;

@Inject
public AccountController(AccountDao accountDao, AccountService accountService) {
this.accountDao = accountDao;
this.accountService = accountService;
}
...

我正在使用

注入(inject) AccountDao 和 AccountService
ResourceConfig config = new ResourceConfig()
.packages("controller", "exception")
.register(new MyDIBinder());

MyDIBinder 包含所有绑定(bind)(例如

AccountDaoImpl accountDaoImpl = new AccountDaoImpl();
bind(accountDaoImpl).to(AccountDao.class);

)

现在我想为这个 Controller 编写一个单元测试,是否可以将整个 AccountController 实例及其所有传递依赖项注入(inject)到测试中?

有点像

    @Inject
AccountController accountController;

最佳答案

您可以使用主要的 IoC 容器,并且只显式地注入(inject)测试类。 Jersey 使用 HK2 作为它的 DI 框架,它的 IoC 容器是 ServiceLocator,它有一个方法 inject(anyObject) 可以注入(inject)任何在它的注册表中有依赖的对象.

例如你可以做类似的事情

public class InjectionTest {

@Inject
private TestController controller;

@Before
public void setUp() {
final Binder b = new AbstractBinder() {
@Override
public void configure() {
bindAsContract(TestController.class);
}
};
final ServiceLocator locator = ServiceLocatorUtilities.bind(new TestBinder(), b);
locator.inject(this);
}

@Test
public void doTest() {
assertNotNull(controller);
String response = controller.get();
assertEquals("Hello Tests", response);
}
}

ServiceLocatorUtilities 类是一个辅助类,可以让我们轻松创建ServiceLocator,然后我们只需调用inject(this) 即可注入(inject) InjectionTest

如果对所有 Controller 测试执行此操作似乎是重复的,您可能需要创建一个抽象基测试类。也许像

public abstract class AbstractControllerTest {

protected ServiceLocator locator;
private final Class<?> controllerClass;

protected AbstractControllerTest(Class<?> controllerClass) {
this.controllerClass = controllerClass;
}

@Before
public void setUp() {
final AbstractBinder binder = new AbstractBinder() {
@Override
public void configure() {
bindAsContract(controllerClass);
}
};
locator = ServiceLocatorUtilities.bind(new TestBinder(), binder);
locator.inject(this);
}

@After
public void tearDown() {
if (locator != null) {
locator.shutdown();
}
}
}

然后在你的具体类中

public class TestControllerTest extends AbstractControllerTest {

public TestControllerTest() {
super(TestController.class);
}

@Inject
private TestController controller;

@Test
public void doTest() {
assertNotNull(controller);
assertEquals("Hello Tests", controller.get());
}
}

如果您多花一些时间,我相信您可以想出更好的抽象测试类设计。这是我想到的第一件事。

注意:对于范围内的任何请求,您可能只需要模拟它。运行单元测试时,没有请求上下文,因此测试会失败。

另请参阅:

关于java - Jersey 2 将依赖项注入(inject)单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36544008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com