Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用模拟对象测试Jersey rest服务_Java_Rest_Mocking_Jersey_Integration Testing - Fatal编程技术网

Java 如何使用模拟对象测试Jersey rest服务

Java 如何使用模拟对象测试Jersey rest服务,java,rest,mocking,jersey,integration-testing,Java,Rest,Mocking,Jersey,Integration Testing,我已经开发了一个使用运动衫的休息服务。现在我想为这个web服务编写一些集成测试,但是由于并不是web服务中使用的每个类都已经实现了,所以我需要模拟其中的一些类。例如,我有以下课程: public class A { private String getWeather() { return null; } } 我的web服务如下所示: @Path("/myresource") public class MyResource { @GET @P

我已经开发了一个使用运动衫的休息服务。现在我想为这个web服务编写一些集成测试,但是由于并不是web服务中使用的每个类都已经实现了,所以我需要模拟其中的一些类。例如,我有以下课程:

public class A {

    private String getWeather() {
        return null;
    }
}
我的web服务如下所示:

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

    @GET 
    @Produces("text/plain")
    public String getIt() {
        A a = new A();
        return a.getWeather();
    }
}
问题是getWeather函数还没有准备好,所以我需要模拟这个函数的返回值。但是对于我发出rest调用的集成测试,我不知道怎么做


有什么想法吗?

您可以使用
powermockito
()


请注意,您可以在新的时候使用PowerMockito的
模拟局部变量创建-这应该可以解决您在
getIt()
方法中对
a a=new a()
代码的担忧。

您可以使用
Power Mockito
实现这一点()


请注意,您可以使用PowerMockito的
whenNew
模拟局部变量的创建-这应该考虑到您在
getIt()
方法中对
a a=new a()
代码的关注。

要使您的设计与a解耦,您应该将其作为参数传递给MyResource。然后你可以用手或者用mockito轻松地模仿它。对于构造函数注入,它将如下所示:

@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不会弄乱您的类文件。测试的是您的代码,而不是动态生成的代码

许多人认为建筑工人的注射有点过时。我老了,所以我喜欢。。。。使用spring(我不建议您使用该框架),您可以自动关联变量,如下所示:

@Autowire
private A a;

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

要使您的设计与A解耦,您应该将其作为参数传递给MyResource。然后你可以用手或者用mockito轻松地模仿它。对于构造函数注入,它将如下所示:

@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不会弄乱您的类文件。测试的是您的代码,而不是动态生成的代码

许多人认为建筑工人的注射有点过时。我老了,所以我喜欢。。。。使用spring(我不建议您使用该框架),您可以自动关联变量,如下所示:

@Autowire
private A a;

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

你试过使用Mockito吗?您可以模拟对
getWeather
的调用,并为测试返回
teststring
对象。看一看,这不起作用,因为在rest资源中创建了一个类的新实例,所以并没有使用mock对象?您可以模拟对
getWeather
的调用,并为测试返回
teststring
对象。看一看,这不起作用,因为在rest资源中创建了一个类的新实例,所以并没有使用模拟对象。因为我想运行集成测试,所以我并没有创建MyResource的实例,而是使用rest客户端调用服务。我试着使用mockito,但它没有使用mocked函数,而是使用原始函数。实际上,如果它与Jersey测试框架一起使用,它就可以工作!谢谢!请注意,powermock会修改类文件以实现这一点。我建议让您的设计更易于测试,而不是使用powermock。Powermock是在遗留系统上进行测试的优秀工具,但不应在开发新东西时使用。(IMO…:-)@Pat:prepareForTest应该是一个.class,不是吗?因为我想运行集成测试,所以我没有创建MyResource的实例,而是使用Rest客户端调用服务。我试着使用mockito,但它没有使用mocked函数,而是使用原始函数。实际上,如果它与Jersey测试框架一起使用,它就可以工作!谢谢!请注意,powermock会修改类文件以实现这一点。我建议让您的设计更易于测试,而不是使用powermock。Powermock是在遗留系统上进行测试的优秀工具,但不应在开发新东西时使用。(国际海事组织…:-)@Pat:prepareForTest应该是A级的,不是吗?