我用GET,POST,UPDATE和DELETE四种方法创建了Rest服务。这些方法建立了到数据库的连接以检索和存储数据。
现在,我想测试每种方法。我为此使用了Jersey测试框架。只要删除代码,真正对数据库进行调用的代码就可以正常工作。当我留下进行数据库调用的代码时,它引发了一个异常,即它无法连接到数据库。
编辑:我做了一些研究,并使用了依赖注入。数据库调用移到一个单独的类,但是我仍然在做错什么。
数据库结果。在此类中,将调用数据库。
public class DatabaseResults {
private final String getQuery = "SELECT * FROM movies";
private Connection connection = null;
private PreparedStatement pstmt = null;
private final ArrayList<Movie> jsonList = new ArrayList<>();
public JSONObject getAllMovies() throws SQLException {
try {
ComboPooledDataSource dataSource = DatabaseUtility.getDataSource();
connection = dataSource.getConnection();
pstmt = connection.prepareStatement(getQuery);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
jsonList.add(new Movie(rs.getString(1), rs.getString(2), rs.getString(4), rs.getString(3)));
}
} catch (SQLException ex) {
System.out.println(ex);
System.out.println("Could not retrieve a connection");
connection.rollback();
} finally {
connection.close();
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("movies", jsonList);
return jsonObject;
}
}
包含REST方法的MoviesResource
@Path("movies")
public class MoviesResource {
....
private DatabaseResults dbResults = null;
public MoviesResource() {
this(new DatabaseResults());
}
MoviesResource(DatabaseResults dbr){
this.dbResults = dbr;
}
....
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getAllMovies() throws JSONException, SQLException {
return Response.status(200).entity(dbResults.getAllMovies().toString()).build();
}
测试班
@RunWith(MockitoJUnit44Runner.class)
public class MovieResourceTest extends JerseyTest {
JSONObject jsonObject = new JSONObject();
@Mock
DatabaseResults dbr;
@Before
public void setup() throws SQLException{
jsonObject.put("id", "hello");
when(dbr.getAllMovies()).thenReturn(jsonObject);
}
Client client = ClientBuilder.newClient();
WebTarget target = client
.target("http://localhost:9998/RestServiceMovies/resources");
@Override
protected Application configure() {
return new ResourceConfig(MoviesResource.class);
}
@Test
public void getAllMoviesTest() throws SQLException {
String responseGetAllMovies = target("/movies").request().get(String.class);
Assert.assertTrue("hello".equals(responseGetAllMovies));
}
目前,我可以运行测试,但是仍然可以在测试getAllMovies()
方法时调用真实数据库,而不返回jsonObject
。
我感觉到模拟对象和MovieResource类的构造函数之间缺少连接?
当您将资源注册为课程时
new ResourceConfig(MoviesResource.class)
您要告诉Jersey创建实例。如果您没有配置任何DI,它将仅调用no-arg构造函数。在无参数构造函数中,您只是自己创建服务。它对您的模拟一无所知。
相反,您应该做的是将资源类注册为实例。这样,您可以将模拟传递给构造函数。
MockitoAnnotations.initMocks(this);
return new ResourceConfig()
.register(new MoviesResource(dbr));
不要使用Mockito赛跑者。而是使用该MockitoAnnotations.initMocks
方法。这样,您可以控制何时@Mock
注入s。如果使用流道,则注入不会及时发生,因为该configure
方法是在Mockito注入发生之前由框架调用的。
问题内容: 我的组织正在努力在JBoss应用服务器上构建RESTful Web服务。迄今为止,QA团队已使用SoapUI来测试SOAP Web服务。SoapUI具有具有REST功能的新版本。我们正在考虑使用它。 网上是否有任何可以免费测试的可公开获得的RESTful服务? 有哪些工具可用于测试RESTful Web服务? 问题答案: soapUI也可以完成这项工作,请查看此博客文章以开始使用。
问题内容: 我对Java单元测试非常陌生,听说Mockito框架对于测试非常有用。 我已经开发了一个REST Server(CRUD方法),现在我想对其进行测试,但是我不知道如何? 我什至不知道该测试程序应该如何开始。我的服务器应该在本地主机上运行,然后在该URL上进行调用(例如,本地主机:8888)? 这是我到目前为止尝试过的方法,但是我很确定这不是正确的方法。 这是方法的代码。 在此测试用
我正在尝试使用SoapUI(5.0.0 beta)来测试RESTful Web服务,该服务会对提供的回调URL发出异步响应。 到目前为止,我能够调用该服务并确认收到的初始同步响应。我还创建了一个“REST MockService”,它对从服务器收到的回调发出适当的响应,并在初始请求中为此提供endpoint作为回调 URL。 我现在正在努力创建一个测试用例,将两者联系在一起,这样我就可以在继续我的
我试图为用Spring编写的REST服务设置一个简单的Arquillian测试。下面是我的SpringBoot应用程序: 和控制器:
我一直试图为我编写的基于Spring MVC的Rest服务找到一个简单的通用单元测试框架。 我一直在网上搜索,并将其缩小到: RESTFUSE(http://developer.eclipsesource.com/restfuse/) 放心(https://github.com/jayway/rest-asured) MockMVC(http://www.petrikainulainen.net/
我试图在我的项目中使用JerseyTest框架添加ReST调用的单元测试。我复制粘贴了一个最简单的示例,但出现了一个运行时异常: 附加代码和pom依赖项: