gpt4 book ai didi

java - 将要通过字段注入(inject) (CDI) 初始化的测试字段

转载 作者:行者123 更新时间:2023-11-29 04:28:55 27 4
gpt4 key购买 nike

假设我们有以下代码片段作为完整 Java EE 应用程序的一部分:

@Singleton
public class LoginService {


@Inject
private UserDAO userDAO;



protected boolean login(String username, String password){

// [...]
User user = userDAO.findByUsername(username);

// [...]

}


}

UserDAO 是一个接口(interface),该接口(interface)有一个名为 DatabaseUserDAO 的特定类实现,它被注入(inject)到 userDAO 字段中。

现在我要为登录方法e编写一个测试。 G。 testLoginSuccessfulIfLoginDataCorrect()。但是因为我不想依赖数据库,所以我只想通过使用一个类来 stub 它,例如public class TestUserDAO implements UserDAO并注入(inject)这个而不是注入(inject)的默认类。实现它的可能性有哪些?我们还假设没有构造函数注入(inject)或其他方法来初始化该字段。

最佳答案

将 arquillian ( http://arquillian.org/ ) 与 mockito ( http://site.mockito.org/ ) 或其衍生物之一一起使用:

  • 创建要注入(inject)的 UserDAO 模型
  • 从您的被测类和模拟中创建一个包
  • 创建一个 junit 测试,获取您的 LoginService 以及注入(inject)的模拟,并将其用于测试:

示例(根据实际代码修改以在某种程度上匹配您的类名):(注意:这种deployment生成方式只适用于maven项目)

 @RunWith(Arquillian.class)
public class LoginSeviceTest {
// a pattern I find quite neat: hold the mocks in a static local class, but they might be anywhere else
public static class LocalMocks {
@Produces public static UserDAO mockUser = Mockito.mock(UserDAO.class);
}

@Deployment
public static WebArchive createDeployment() {
PomEquippedResolveStage pom = Maven.resolver().loadPomFromFile("pom.xml");
BeansDescriptor beansXml = Descriptors.create(BeansDescriptor.class)
.addDefaultNamespaces().getOrCreateAlternatives()
.up();

WebArchive jar = ShrinkWrap.create(WebArchive.class)
.addAsLibraries(pom.resolve("org.mockito:mockito-core").withTransitivity().asFile())
.addClass(LoginService.class) // eventually further classes or packages you depend on
.addClass(LoginSeviceTest.LocalMocks.class)
.addAsWebInfResource(new StringAsset(beansXml.exportAsString()), "beans.xml");

return jar;
}

@Inject LoginService loginService;

@Test
public void testLogin() {
// use the injected loginService here for actual tests
}
}

请注意,您不需要以这种方式更改被测类以使测试成为可能。

关于java - 将要通过字段注入(inject) (CDI) 初始化的测试字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44688159/

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