【问题标题】:java spring - failing to test rest servicejava spring - 无法测试休息服务
【发布时间】: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。无论如何,调试会告诉我们。

标签: java spring rest junit


【解决方案1】:

当我使用 Junit 运行测试时,Spring 引导实际上并没有建立数据库连接(或类似的东西)。我所做的是使用 Mockito 模拟我正在调用的服务:

Mockito.when(adServersReportsService.getAdServerComparison(Mockito.any(),Mockito.any(), Mockito.any(),Mockito.any(), Mockito.any())).thenReturn("test");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2014-12-01
    • 1970-01-01
    相关资源
    最近更新 更多