我必须为一个调用API然后处理响应的类编写测试。类有两个公共函数和一个私有函数。第一个公共方法获取ID列表。在循环中为每个ID调用第二个公共方法,以获取与ID关联的详细信息。私有方法是在第二个公共方法内部调用的,因为获取基于id的详细信息的调用是异步进行的。
我是JUnits的新手,虽然我知道我不应该测试API调用,只是测试我的函数,但我仍然不明白单元测试应该断言什么。
public List<Integer> fetchVehicleIds(String datasetId) throws ApiException {
VehiclesApi vehiclesApi = new VehiclesApi();
List<Integer> vehicleIds;
vehicleIds = vehiclesApi.vehiclesGetIds(datasetId).getVehicleIds();
return vehicleIds;
}
public List<VehicleResponse> fetchVehicleDetails(String datasetId, List<Integer> vehicleIds) throws InterruptedException, ApiException {
CountDownLatch latch = new CountDownLatch(vehicleIds.size());
List<VehicleResponse> vehiclesList = new ArrayList<>();
for (Integer vehicleId: vehicleIds) {
populateEachVehicleDetail(datasetId, vehicleId, vehiclesList, latch);
}
latch.await();
return vehiclesList;
}
private void populateEachVehicleDetail(String datasetId, Integer vehicleId, List<VehicleResponse> vehiclesList, CountDownLatch latch) throws ApiException {
ApiCallback<VehicleResponse> vehicleResponseApiCallback = new ApiCallback<VehicleResponse>() {
@Override
synchronized public void onSuccess(VehicleResponse result, int statusCode, Map<String, List<String>> responseHeaders) {
vehiclesList.add(result);
latch.countDown();
}
};
VehiclesApi vehiclesApi = new VehiclesApi();
vehiclesApi.vehiclesGetVehicleAsync(datasetId,vehicleId,vehicleResponseApiCallback);
}
这两个语句确实是您希望在单元测试中隔离的东西:
private void populateEachVehicleDetail(String datasetId, Integer vehicleId, List<VehicleResponse> vehiclesList, CountDownLatch latch) throws ApiException {
....
VehiclesApi vehiclesApi = new VehiclesApi();
vehiclesApi.vehiclesGetVehicleAsync(datasetId,vehicleId,vehicleResponseApiCallback);
...
}
1)让你的依赖性成为可嘲弄的
但是您只能模拟一些您可以从类的客户端设置的内容。
在这里,API是一个局部变量。因此,您应该更改类以公开依赖项,例如在构造函数中。
这样您就可以很容易地模拟它。
@Override
synchronized public void onSuccess(VehicleResponse result, int statusCode, Map<String, List<String>> responseHeaders) {
vehiclesList.add(result);
latch.countDown();
}
@Mock
VehiclesApi vehiclesApiMock;
// ...
// when the api method is invoked with the expected dataSetId and vehicleId
Mockito.when(vehiclesApiMock.vehiclesGetVehicleAsync(Mockito.eq(datasetId), Mockito.eq(vehicleId),
Mockito.any(ApiCallback.class)))
// I want to invoke the callback with the mocked data
.then(invocationOnMock -> {
ApiCallback<VehicleResponse> callback = invocationOnMock.getArgument(2);
callback.onSuccess(mockedVehicleResponse, mockedStatusCode,
mockedResponseHeaders);
return null; // it is a void method. So no value to return in T then(...).
});
我认为apicallback
缺少一个强制转换,但您应该有总体的想法。
我有一个程序,显示与名称和用户需要输入他们的字段。我怎么测试这个? AssertionError:JSON路径“$.FirstName”处没有值,异常:JSON不能为null或空 我的测试: storetest.java
我有下面的类,我测试了method1,并模拟了method2和method3。我只测试这样的用例:*如果method2调用是OK,那么==>OK*如果method2抛出NotFoundException,method3返回OK==>OK*如果method2抛出NotFoundException,method3抛出ServiceException==>ServiceException确实抛出了 为了
在我的项目(spring boot应用程序)中,我有大约200个测试用例。最近,我们为缓存管理器(ehcache)实现了一个工厂bean,它位于我的启动类(@SpringBootApplication)中。 我的问题是,一旦带有工厂bean的启动类被一个测试用例执行,所有后续的测试用例都会失败,并出现错误。。。 “同一个VM中已存在另一个同名“appCacheManager”的CacheManag
超出此范围 该方法将不断询问,直到输入正确的数字。列为 arrays starting at 0 and returned @param turn Player which ever players turn it is, is asked for a column @return int the column is returned after lowered by one */
我尊敬的java开发者朋友们。我正在尝试测试并覆盖克隆方法的捕获块。我已经浪费了一个星期,但没有找到任何解决方法来弥补这个障碍。请帮帮我。 我的源代码- 我的Junit测试用例- 我已经为图片提供了链接,这将使我对这个问题和我所做的尝试有更多的了解。 源代码- 我尝试过的junit-
我正在尝试为这样的情况编写测试用例,在这个情况下,我期待的是datatruncation异常,我试图使用assert equals和比较消息来断言相同的情况,但是看起来像是比较两个字符串,有没有更好的方法来为这样的异常编写测试用例。 我正在使用JUnit5