[JavaEE] Implement a test for REST endpoint
1. We have the BookEndpoint.java:
package com.pluralsight.bookstore.rest; import com.pluralsight.bookstore.model.Book; import com.pluralsight.bookstore.repository.BookRepository; import javax.inject.Inject; import javax.validation.constraints.Min; import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import java.net.URI; import java.util.List; import static javax.ws.rs.core.MediaType.APPLICATION_JSON; //api/books @Path("/books") public class BookEndpoint { @Inject private BookRepository bookRepository; @POST @Consumes(APPLICATION_JSON) public Response createBook(Book book, @Context UriInfo uriInfo) { book = bookRepository.create(book); URI createedURI = uriInfo.getBaseUriBuilder().path(book.getId().toString()).build(); return Response.created(createedURI).build(); } @GET @Produces(APPLICATION_JSON) public Response getBooks() { List<Book> books = bookRepository.findAll(); if(books.size() == 0) { return Response.noContent().build(); } return Response.ok(books).build(); } @GET @Path("/{id: \\d+}") @Produces(APPLICATION_JSON) public Response getBook(@PathParam("id") @Min(1) Long id) { Book book = bookRepository.find(id); if(book == null) { return Response.status(Response.Status.NOT_FOUND).build(); } return Response.ok(book).build(); } // api/books/count @GET @Path("/count") public Response countBooks() { Long nbOfBooks = bookRepository.countAll(); if(nbOfBooks == 0) { return Response.noContent().build(); } return Response.ok(nbOfBooks).build(); } @DELETE @Path("/{id : \\d+}") public Response deleteBook(Long id) { bookRepository.delete(id); return Response.noContent().build(); } }
2. Creating a test for the REST endpoint:
package com.pluralsight.bookstore.rest; import com.pluralsight.bookstore.model.Book; import com.pluralsight.bookstore.model.Language; import com.pluralsight.bookstore.repository.BookRepository; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Response; import java.util.Date; import static javax.ws.rs.core.MediaType.APPLICATION_JSON; import static javax.ws.rs.core.Response.Status.CREATED; import static javax.ws.rs.core.Response.Status.NO_CONTENT; import static org.junit.Assert.*; @RunWith(Arquillian.class) public class BookEndpointTest { //testable tell wildfly not to package this test, // cause we want to test from outside by using HTTP @Deployment(testable = false) public static JavaArchive createDeployment() { return ShrinkWrap.create(JavaArchive.class) .addClass(BookRepository.class) .addClass(Book.class) .addClass(Language.class) .addClass(BookEndpoint.class) .addClass(JAXRSConfiguration.class) .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml") .addAsManifestResource("META-INF/test-persistence.xml", "persistence.xml"); } @After public void tearDown() throws Exception { } @Test public void createBook(@ArquillianResource("api/books")WebTarget webTarget) { // Test counting books Response response = webTarget.path("count").request().get(); assertEquals(NO_CONTENT.getStatusCode(), response.getStatus()); // Test find all response = webTarget.request(APPLICATION_JSON).get(); assertEquals(NO_CONTENT.getStatusCode(), response.getStatus()); // Create a book Book book = new Book("isbn", null, 12F, 123, Language.ENGLISH, new Date(), "imageURL", "description"); response = webTarget.request(APPLICATION_JSON).post(Entity.entity(book, APPLICATION_JSON)); assertEquals(CREATED.getStatusCode(), response.getStatus()); } }
分类:
Java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2017-08-04 [React] Close the menu component when click outside the menu
2017-08-04 [D3] SVG Graphics Containers and Text Elements in D3 v4
2016-08-04 [React Native + Firebase] React Native: Real time database with Firebase -- setup & CRUD
2014-08-04 [Javascript] Closure Cove, Common mistake
2014-08-04 [Javascript]Clouse Cove, 2 ,Modifying Bound Values After Closure
2014-08-04 [Javascript] Closure Cove, 1
2014-08-04 [Backbone]7. Collection Views, Custom Events