我正在使用Jersey编写REST Web服务,我正在尝试使用Jersey测试框架编写一组单元测试来测试服务。
但是,我使用HTTP身份验证和SecurityContext作为我的Web服务的一部分,我在设置JTF时遇到问题,允许我测试这些方面。我可以在请求中发送身份验证信息,但如何配置它以了解我希望设置的不同角色和用户?
我目前正在使用Jetty(通过JettyTestContainerFactory),但如果需要,可以切换到不同的测试容器。
我想要实现的具体配置是两个角色,四个用户具有这些可能角色的组合(例如,无角色,角色a,角色b,角色a和b)。 Web服务将处理对不同URL的访问,因此不需要在配置中指定。
答案 0 :(得分:1)
我通过实现类似于Jersey提供的Jetty Test容器来完成此操作。我们使用嵌入式Jetty来正常测试我们的开发应用程序,并通过创建我们自己的基于嵌入式Jetty的测试容器来加载我们的Web应用程序,就像它是由Java主进程启动一样。
我们使用在jetty-env.xml文件中配置的自定义Jetty安全处理程序,嵌入式Jetty用于配置安全性。
<Set name="securityHandler">
<New class="com.example.DevelopmentSecurityHandler">
<Set name="loginService">
<New class="com.example.DevelopmentLoginService">
<Set name="name">LocalRealm</Set>
<Set name="config">src/main/webapp/WEB-INF/users.properties</Set>
<Call name="start" />
</New>
</Set>
<Set name="authenticator">
<New class="com.example.DevelopmentAuthenticator"></New>
</Set>
<Set name="checkWelcomeFiles">true</Set>
</New>
</Set>
Jetty env文件由嵌入式Jetty加载:
XmlConfiguration configuration = null;
if (jettyEnvFile.exists()) {
try {
configuration = new XmlConfiguration(jettyEnvFile.toURI().toURL());
} catch (Exception e) {
throw new ProcessingException(String.format("Exception loading jetty config from %s", jettyEnvFile));
}
} else {
LOG.warn("No jetty-env.xml found.");
}
该xml中引用的users.properties文件是角色映射的简单用户,例如 USERNAME = PASSWORD,ROLE_NAME1,ROLE_NAME2
根据您配置Jetty安全性的方式,这可能适用于您,也可能不适合您。您也可以通过编程方式对其进行配置,有很多嵌入式Jetty here的示例。 SecuredHelloHandler.java示例可能是一个很好的开始。
对于测试容器,您基本上可以从复制org.glassfish.jersey.test.jetty.JettyTestContainerFactory
和org.glassfish.jersey.jetty.JettyHttpContainerFactory
开始,实质上更改
public static Server createServer(final URI uri, final SslContextFactory sslContextFactory, final JettyHttpContainer handler, final boolean start)
创建您的安装版本的嵌入式Jetty服务器的方法,但需要。