开发/测试版Google App Engine LogService

时间:2013-02-04 17:33:30

标签: java google-app-engine service jar classpath

我正在尝试使用Google App Engine LogService的“测试”或“开发”版本,以便我可以在GAE之外的单元测试中使用它。

我在我的类路径中包含了appengine-testing.jarappengine-api.jarappengine-api-stubs.jar,并看到了一个看起来像我想要的类:

  

com.google.appengine.api.log.dev.LocalLogService

当我创建一个这样的实例并尝试寻找fetch(LogQuery)方法时,我没有看到任何方法。很明显,这不是我正在寻找的课程。我哪里错了?提前谢谢。

2 个答案:

答案 0 :(得分:2)

只需使用类似Mockito的内容来模拟GAE LoggingService

@Test
public void myUnitTest() {
    // Given
    MyPojo fixture = new MyPojo();

    LoggingService mockService = Mockito.mock(Logging.Service);

    Mockito.doNothing().when(mockService).fetchLogs(Mockito.any());

    fixture.setLoggingService(mockService);

    // When
    fixture.logSomethingToGAELogs("Some string to log");

    // Then - verify
    Mockito.verify(mockService).fetchLogs("Some string to log");
}

答案 1 :(得分:0)

我相信com.google.appengine.api.log.dev.LocalLogService是你正在寻找的,它之所以具有与com.google.appengine.api.log.LogService不同的类签名的原因是LocalLogService只是一个期待或半生不熟的实现。该类可能会在将来的版本中更改。

如果查看LogService source,则fetch方法返回形成为Iterable< RequestLogs>的日志记录。在LocalLogService中,它不是从实时应用服务器获取日志记录,而是从内存中读取日志记录(形成为LogReadResponse,通常是Iterable< RequestLogs>的包装)。以下示例代码演示了它的工作原理:

public void foo() {
  String requestId = "1234";

  localLogService = new LocalLogService();

  // Mock a request log record:
  localLogService.addRequestInfo("sample-app", "1", requestId, null, null, startTimeUsec, endTimeUsec, 
          "GET", "", "HTTP/1.1", null, true, 200, null);

  // Mock an app log record:
  localLogService.addAppLogLine(requestId, startTimeUsec, 2, "this is a sample log message.");   

  LogReadRequest request = new LogReadRequest();
  // Filter request 1234:
  request.addRequestId(requestId);
  // Version id must match the one you just mocked, do not use dot in-between:
  request.addVersionId("1");
  request.setIncludeIncomplete(true);
  request.setIncludeAppLogs(true);

  Status status = new Status();
  status.setSuccessful(true);

  // Read mocked log records from memory:
  LogReadResponse response = localLogService.read(status, request);

  for (RequestLog log : response.logs()) {
    System.out.println("request log: " + log.getCombined());
    for (LogLine line : log.lines()) {
      System.out.println("app log: " + line.getLogMessage());
    }
  }
}

示例输出:

  

请求日志: - - - [8 / Feb / 2013:09:51:13 -0800]“获取HTTP / 1.1”200 - - -
  app log:这是一个示例日志消息。

为了更好的代码设计,您可以将LocalLogService包装到LogService的实现中,以使类签名更加一致。