【问题标题】:How to test RESTful application?如何测试 RESTful 应用程序?
【发布时间】:2017-01-18 12:44:43
【问题描述】:

我有一个带有服务的应用示例:

RestApp.java

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/webapi")
public class RestApp extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        final Set<Class<?>> classes = new HashSet<>();
        classes.add(MessageService.class);
        return classes;
    }
}

MessageService.java

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.net.URI;
import java.util.List;

@Stateless
@Path("/messages")
public class MessageService {

    @Inject
    private MessagesManager messagesManager;

    @GET
    @Path("all")
    @Produces({MediaType.APPLICATION_JSON})
    public List<Message> getMessages() {
        return messagesManager.getMessages();
    }
}

并且服务依赖于单例 MessagesManager.java:

import javax.ejb.*;
import javax.inject.Singleton;

@Singleton
@Startup
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
public class MessagesManager implements Serializable {

    private List<Message> messages = new ArrayList<>();

    @Lock(LockType.READ)
    public List<Message> getMessages() {
        messages.add(new Message(1, "message text"));
        return messages;
    }
}

这个应用程序运行良好。但是在测试过程中出现注入错误:

org.glassfish.hk2.api.UnsatisfiedDependencyException: SystemInjecteeImpl 没有可用于注入的对象(requiredType=MessagesManager,parent=MessageService,qualifiers={},position=-1,optional=false,self=false,unqualified =null,1232089028)

测试代码是:

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Response;
import static org.junit.Assert.assertEquals;

public class RestAppTest extends JerseyTest {

    @Override
    protected Application configure() {
        return new ResourceConfig(MessageService.class);
    }

    @Test
    public void testGet() {
        final Response response = target("messages/all").request().get();
        assertEquals(200, response.getStatus());
    }
}

为什么会发生以及如何解决?

【问题讨论】:

    标签: java jax-rs jersey-test-framework


    【解决方案1】:

    应用程序上下文中缺少类 MessagesManager。像这样添加类来配置方法:

    return new ResourceConfig(MessageService.class, MessagesManager.class);
    

    【讨论】:

      【解决方案2】:

      你需要几样东西

      1> REST API 的格式良好的 JSON 结构

      2> 某种 REST 客户端,例如用于 chrome、Mozilla 等的高级 REST 客户端,可用作插件。 POSTMAN 也是一个有用的工具

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多