Arquillian ShrinkWrap 如何将资产添加到文件系统路径
Arquillian ShrinkWrap how to add an asset to the file system path
我正在导入一个从文件系统而不是我的 Web 存档的资源文件夹中读取的库。我希望能够通过使用 ShrinkWrap 添加具有该路径的资产来实质上模拟该文件,因此我可以 运行 在我的构建服务器上进行测试,而不保证文件系统包含所有这些文件。我试图在适当的路径中添加一个字符串资产,但代码找不到该资产。这是我要实现的目标的示例。
休息资源
@Path("/hello-world")
public class HelloWorldResource {
@GET
public Response getHelloWorld(){
return Response.ok(getFileContent()).build();
}
private String getFileContent() {
StringBuilder builder = new StringBuilder();
try {
BufferedReader bufferedReader = new BufferedReader(
new FileReader(
"/usr/myFile.txt"));
String line = bufferedReader.readLine();
while (line != null) {
builder.append(line);
line = bufferedReader.readLine();
}
}
catch (Exception e) {
e.printStackTrace();
}
return builder.toString();
}
}
测试
@RunWith(Arquillian.class)
public class HelloWorldResourceTest {
@Deployment
public static WebArchive createDeployment()
{
WebArchive webArchive = ShrinkWrap
.create(WebArchive.class)
.addPackages(true,
HelloWorldApplication.class.getPackage(),
HelloWorldResource.class.getPackage(),
Hello.class.getPackage())
.add(new StringAsset("Blah"),"/usr/myFile.txt")
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
System.out.println("WebArchive: " + webArchive.toString(true));
return webArchive;
}
@Test
@RunAsClient
public void testHello(
@ArquillianResteasyResource("hello-world") final WebTarget webTarget)
{
final Response response = webTarget
.request(MediaType.APPLICATION_JSON)
.get();
String hello = response.readEntity(String.class);
System.err.println("Hello: " + hello);
Assert.assertEquals("Status is not OK", response.getStatus(), 200);
}
}
Web 存档到字符串
/WEB-INF/
/WEB-INF/classes/
/WEB-INF/classes/com/
/WEB-INF/classes/com/
/WEB-INF/classes/com/
/WEB-INF/classes/com/helloworld/
/WEB-INF/classes/com/helloworld/application/
/WEB-INF/classes/com/helloworld/application/HelloWorldApplication.class
/WEB-INF/classes/com/helloworld/resource/
/WEB-INF/classes/com/helloworld/resource/HelloWorldResourceTest.class
/WEB-INF/classes/com/helloworld/resource/HelloWorldResource.class
/WEB-INF/classes/com/helloworld/dataobjects/
/WEB-INF/classes/com/helloworld/dataobjects/Hello.class
/WEB-INF/beans.xml
/usr/
/usr/myFile.txt
我收到以下错误:
java.io.FileNotFoundException: /usr/myFile.txt (No such file or
directory)
似乎 ShrinkWrap 正在将 /usr/myFile.txt 添加为存档中的相对路径,而不是使它看起来像 /usr/myFile.txt 位于我的文件系统的根目录中。有什么办法可以让 ShrinkWrap 做我想做的事吗?
Shrinkwrap 旨在创建档案,因此 API 的范围是在您正在创建的档案中创建资产。如果你想在常规文件系统中创建资源,只需使用 JDK,Shrinkwrap 无法帮助你。
或者,如果可能,更改您的资源以从类路径而不是文件系统路径读取资源。使用这种方法,您可以轻松地使用 Shrinkwrap 交换测试内容,就像您现在尝试使用示例一样。
我正在导入一个从文件系统而不是我的 Web 存档的资源文件夹中读取的库。我希望能够通过使用 ShrinkWrap 添加具有该路径的资产来实质上模拟该文件,因此我可以 运行 在我的构建服务器上进行测试,而不保证文件系统包含所有这些文件。我试图在适当的路径中添加一个字符串资产,但代码找不到该资产。这是我要实现的目标的示例。
休息资源
@Path("/hello-world")
public class HelloWorldResource {
@GET
public Response getHelloWorld(){
return Response.ok(getFileContent()).build();
}
private String getFileContent() {
StringBuilder builder = new StringBuilder();
try {
BufferedReader bufferedReader = new BufferedReader(
new FileReader(
"/usr/myFile.txt"));
String line = bufferedReader.readLine();
while (line != null) {
builder.append(line);
line = bufferedReader.readLine();
}
}
catch (Exception e) {
e.printStackTrace();
}
return builder.toString();
}
}
测试
@RunWith(Arquillian.class)
public class HelloWorldResourceTest {
@Deployment
public static WebArchive createDeployment()
{
WebArchive webArchive = ShrinkWrap
.create(WebArchive.class)
.addPackages(true,
HelloWorldApplication.class.getPackage(),
HelloWorldResource.class.getPackage(),
Hello.class.getPackage())
.add(new StringAsset("Blah"),"/usr/myFile.txt")
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
System.out.println("WebArchive: " + webArchive.toString(true));
return webArchive;
}
@Test
@RunAsClient
public void testHello(
@ArquillianResteasyResource("hello-world") final WebTarget webTarget)
{
final Response response = webTarget
.request(MediaType.APPLICATION_JSON)
.get();
String hello = response.readEntity(String.class);
System.err.println("Hello: " + hello);
Assert.assertEquals("Status is not OK", response.getStatus(), 200);
}
}
Web 存档到字符串
/WEB-INF/
/WEB-INF/classes/
/WEB-INF/classes/com/
/WEB-INF/classes/com/
/WEB-INF/classes/com/
/WEB-INF/classes/com/helloworld/
/WEB-INF/classes/com/helloworld/application/
/WEB-INF/classes/com/helloworld/application/HelloWorldApplication.class
/WEB-INF/classes/com/helloworld/resource/
/WEB-INF/classes/com/helloworld/resource/HelloWorldResourceTest.class
/WEB-INF/classes/com/helloworld/resource/HelloWorldResource.class
/WEB-INF/classes/com/helloworld/dataobjects/
/WEB-INF/classes/com/helloworld/dataobjects/Hello.class
/WEB-INF/beans.xml
/usr/
/usr/myFile.txt
我收到以下错误:
java.io.FileNotFoundException: /usr/myFile.txt (No such file or directory)
似乎 ShrinkWrap 正在将 /usr/myFile.txt 添加为存档中的相对路径,而不是使它看起来像 /usr/myFile.txt 位于我的文件系统的根目录中。有什么办法可以让 ShrinkWrap 做我想做的事吗?
Shrinkwrap 旨在创建档案,因此 API 的范围是在您正在创建的档案中创建资产。如果你想在常规文件系统中创建资源,只需使用 JDK,Shrinkwrap 无法帮助你。
或者,如果可能,更改您的资源以从类路径而不是文件系统路径读取资源。使用这种方法,您可以轻松地使用 Shrinkwrap 交换测试内容,就像您现在尝试使用示例一样。