我正在尝试使用Google App Engine LogService
的“测试”或“开发”版本,以便我可以在GAE之外的单元测试中使用它。
我在我的类路径中包含了appengine-testing.jar
,appengine-api.jar
和appengine-api-stubs.jar
,并看到了一个看起来像我想要的类:
com.google.appengine.api.log.dev.LocalLogService
当我创建一个这样的实例并尝试寻找fetch(LogQuery)
方法时,我没有看到任何方法。很明显,这不是我正在寻找的课程。我哪里错了?提前谢谢。
答案 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的实现中,以使类签名更加一致。