2

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

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

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

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

4

2 回答 2

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");
}
于 2013-02-11T19:06:01.890 回答
0

我相信com.google.appengine.api.log.dev.LocalLogService是您正在寻找的那个,它具有与com.google.appengine.api.log.LogService不同的类签名的原因是 LocalLogService 只是一个期待或半生不熟的实施。这个类可能会在未来的版本中改变。

如果您查看LogService 源,则 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] "GET HTTP/1.1" 200 - - -
应用程序日志:这是一个示例日志消息。

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

于 2013-02-07T21:50:16.940 回答