我正在尝试使用Google App Engine的LogService
的"测试"或"开发"版本,以便在GAE之外的单元测试中使用它。
我在类路径中包含了appengine-testing.jar
、appengine-api.jar
和appengine-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的实现中,以使类签名更加一致。