java - 如何使用模拟对象测试 Jersey 休息服务

标签 java rest mocking jersey integration-testing

我使用 Jersey 开发了一个休息服务。现在我想为此 Web 服务编写一些集成测试,但由于并非 Web 服务中使用的每个类都已经实现,我需要模拟其中的一些。例如我有以下类(class):

public class A {

    private String getWeather() {
        return null;
    }
}

我的网络服务看起来像这样:

@Path("/myresource")
public class MyResource {

    @GET 
    @Produces("text/plain")
    public String getIt() {
        A a = new A();
        return a.getWeather();
    }
}

问题是 getWeather 函数还没有准备好,所以我需要模拟这个函数的返回值。但是对于我发出休息电话的集成测试,我不知道该怎么做。

有什么想法吗?

最佳答案

要使您的设计与 A 分离,您应该将其作为参数传递给 MyResource。然后您可以轻松地手动或使用 mockito 模拟它。使用构造函数注入(inject),它看起来像这样:

@Path("/myresource")
public class MyResource {

    private A a;

    public MyResource(A a) {
        this.a = a;
    }

    @GET 
    @Produces("text/plain")
    public String getIt() {
        return a.getWeather();
    }
}

你可以用它来测试

@Test
public void shouldGetIt() {
    A a = mock(A.class);
    when(a.getWeather()).thenReturn("sunny!");

    MyResource r = new MyResource(a);
    assertThat(r.getIt(), is("sunny!));
}

这会使您的设计脱钩。 MyResource 不再直接依赖于 A,而是依赖于任何看起来像 A 的东西。另一个好处是 mockito 不会弄乱你的类文件。经过测试的是您的代码,而不是即时生成的代码。

许多人认为构造函数注入(inject)有点老套。我老了,所以我喜欢它....使用 spring(我不建议你使用的框架)你可以像这样 Autowiring 变量:

@Autowire
private A a;

而且您根本不需要构造函数。 Spring 将找到 A 的唯一实现并将其插入此变量中。我更喜欢显式编程,所以我随时都会选择构造函数注入(inject)。

关于java - 如何使用模拟对象测试 Jersey 休息服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25104045/

相关文章:

c# - 如何实现 Azure 表存储以允许单元测试

Java语法问题: Why I have to put the clamps there?

python - 带参数的 GET 请求 FlasK/Rest API

java - 如何在排序时忽略某个值,使其始终出现在排序列表的底部

java - 为什么ajax Restful客户端不显示数据(java)?

java - 业务层 Jersey 的基本依赖注入(inject)

python - 模拟通过实例使用的类方法

java - 如何模拟私有(private)静态内部类?

java - 使用 JSP 登录系统 - 忘记密码,使用 sql 数据库?

Java 如何从字符串中解析微笑符号