谷歌应用引擎日志服务的开发/测试版本



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

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

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

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

只需使用类似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");
}

我相信com.google.appengine.api.log.dev.LocalLogService就是你想要的,它之所以有一个与com.google.aappengine.aip.log.LogService不同的类签名,是因为LocalLogService只是一个期待中的或半生不熟的实现。此类可能会在将来的版本中进行更改。

如果您查看LogService源,则fetch方法返回以Iterable<请求日志>。在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());
    }
  }
}

样本输出:

请求日志:[-[2013年2月8日:09:51:13-0800]"GET HTTP/1.1"200[-
应用程序日志:这是一条示例日志消息。

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

最新更新