• [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());
    
        }
    }
  • 相关阅读:
    Jmeter 将正则表达式提取的参数传给全局(跨线程组使用变量)
    pod的状态分析
    前端 -- html介绍和head标签
    Python ----- 线程和进程
    网络编程 ------ 基础
    面向对象相关操作
    面向对象 --- 进阶篇
    python --- 面向对象
    python的模块和包的详细说明
    常用模块------时间模块 , random模块 ,os模块 , sys模块
  • 原文地址:https://www.cnblogs.com/Answer1215/p/9420544.html
Copyright © 2020-2023  润新知