【发布时间】:2016-04-02 12:51:24
【问题描述】:
我有一个 3 层服务和一个 spring 应用程序服务器。 该服务本质上获取一些参数(通过 REST API)调用 一个相应的服务类,它调用相应的存储库类,从数据库中执行一条选择 SQL 语句(使用 JDBC)。
当我运行 Tomcat 服务器并通过 rest 客户端测试 API 时,它工作正常。
现在我的问题 - 我正在尝试使用以下代码测试 API 而不是 ok status 我得到 404
public class AdServersReportsResourceIntegrationTest extends AbstractControllerIntegrationTest
{
private final int responseStatusOK = 200;
@Test
public void getReport() throws Exception
{
Response response = target("adserver").queryParam("fromDate","2015-11-28").queryParam("toDate", "2015-11-30").queryParam("adServer", 1).queryParam("campaign", "569588").queryParam("groupBy", "site").request(javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE).get(Response.class);
Assert.assertEquals(responseStatusOK, response.getStatus());
}
Resource 类如下所示:
@Component
@Scope("singleton")
@Path("/adserver")
public class AdServersReportsResource extends Resource{
Logger logger = LoggerFactory.getLogger(AdServersReportsResource.class);
@Autowired
private AdServersReportsService adServersReportsService;
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getCampaignCapturedEventsReport(
@QueryParam("fromDate") String strdayStart,
@QueryParam("toDate") String strdayEnd,
@QueryParam("adServer") Integer adServerID,
@QueryParam("campaign") String campaignID,
@QueryParam("groupBy") String groupBy){
//input parameter validation
String response = adServersReportsService.getAdServerComparison(strdayStart,strdayEnd,adServerID,campaignID,groupBy).toString();
return createObjectSuccessResponse(response);
}
}
经过反复试验,我发现如果我用存根替换 JDBC 代码,测试就可以工作。 奇怪的是我尝试更改 JDBC 代码以便它执行 SQL 使用我直接在数据库上单独测试的硬编码参数。
有人知道它是什么吗?
【问题讨论】:
-
我了解您想要达到的目标,但您能提供MCVE 吗?您是说,没有 DB 测试可以按预期工作(返回 200)?
-
如果测试使用的是假的 JDBC 代码并发送一个 404 与真实的,那么 JDBC 代码有问题,或者所需的数据不存在。不管是什么原因,createObjectSuccessResponse() 方法必须创建一个 404 响应,而不是其名称所示的成功响应。使用您的调试器并逐步执行代码,以查看服务器上发生了什么。
-
@JBNizet 我也想过,但是如果有异常,那么 a.) 应该从日志中清楚 b.) 应该返回 500,还是不返回?
-
我的猜测是没有例外。 getAdServerComparison() 返回了一些特殊响应(null?空字符串?“错误”?),当该特殊响应传递给 createObjectSuccessResponse() 时,它会创建 404 而不是 200。
-
那个,或者抛出异常,并且这个异常被注释为翻译成404错误。或者有一个错误处理程序在抛出异常时返回 404。无论如何,调试会告诉我们。