Java 如何使用模拟对象测试Jersey rest服务
我已经开发了一个使用运动衫的休息服务。现在我想为这个web服务编写一些集成测试,但是由于并不是web服务中使用的每个类都已经实现了,所以我需要模拟其中的一些类。例如,我有以下课程: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
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级的,不是吗?