Я не использовал aws-sdk-mock, но, видимо, в вашем макете вы используете обратный вызов, а в лямбда-обработчике это асинхронный вызов. Я использую proxyquire для пересмешивания зависимостей. Вот пример:
functionHandler.js
Не нужно использовать callback
и context
во время выполнения лямбды Node8.10
.
let AWSSQS = require('aws-sdk/clients/sqs');
let sqs = new AWSSQS();
exports.functionHandler = async (event) => {
// No need to use callback when Lambda runtime is 8.10.
try {
let parsedBody = JSON.parse(event.Records[0].body);
let modifiedBody = await doStuff(parsedBody);
let sqsPayload = {
MessageBody: JSON.stringify(modifiedBody),
QueueUrl: my-queue-url
};
await sqs.sendMessage(sqsPayload).promise();
return utils.respondSuccess('Done');
} catch (err) {
throw utils.respondError(err);
}
};
test.spec.js
В значительной степени говорят сами за себя. Вы определяете объект с именем зависимости как свойство.
const proxyquire = require('proxyquire');
let app = require('path/to/function');
describe('SQS', () => {
it("an awesome title for my test", async (done) => {
const app = proxyquire(app, {
'aws-sdk/clients/sqs': function() {
this.sendMessage = (params) => {
return {
promise: () => {
return Promise.resolve({
ResponseMetadata: {
RequestId: 'test-request-id'
},
MD5OfMessageBody: 'a892e8d8589e97ca92fb70020f01c16c',
MessageId: 'test-message-id'
});
}
}
}
}
});
let payload = {
Records: [
// Data here
]
};
const data = await app.functionHandler(payload);
let parsedBody = JSON.parse(data.body);
expect(parsedBody.message).to.be.equal("Done");
done();
});
});
Сценарий Groovy (достаточно легкий бросить в Java) демонстрация точки @bobince сделанный о SimpleDateFormat.
import java.text.SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat('MM/dd/yy')
SimpleDateFormat fmt = new SimpleDateFormat('yyyy-MM-dd')
Calendar cal = Calendar.getInstance()
cal.add(Calendar.YEAR, -100)
sdf.set2DigitYearStart(cal.getTime())
dates = ['01/01/01', '10/30/08','01/01/09']
dates.each {String d ->
println fmt.format(sdf.parse(d))
}
Урожаи
2001-01-01
2008-10-30
1909-01-01
SimpleDateFormat уже делает двухразрядный год, анализируя для Вас, с помощью двухбуквенного ‘yy’ формата. (Это все еще позволит четыре цифры, очевидно.)
По умолчанию это использует now-80→now+20, таким образом, это не точно то же правило, Вы делаете предложение, но это разумно и стандартизировано (в мире Java, по крайней мере) и может быть переопределено с помощью set2DigitYearStart (), если Вы хотите.
DateFormat informat= new SimpleDateFormat("MM/dd/yy");
DateFormat outformat= new SimpleDateFormat("MM/dd/yyyy");
return outformat.format(informat.parse(dateString));
В долгосрочной перспективе попытайтесь мигрировать на дату ISO8601, форматирующую (yyyy-MM-dd), потому что MM/dd/yy является приблизительно худшим форматом даты и обязан вызвать проблемы в конечном счете.
Лучший способ состоит в том, чтобы использовать Время Joda API для дат и времени в Java.
Как насчет этого:
public static String anEasierStupidDateWithNoStringParsing(String dateString) {
DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
//handling ParseExceptions is an exercise left to the reader!
Date date = df.parse(dateString);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
Calendar now = Calendar.getInstance();
if (cal.after(now)) {
cal.add(Calendar.YEAR, -100);
}
return cal;
}
Другими словами, позвольте SimpleDateFormat проанализировать Строку и просто скорректировать год, чтобы быть в предыдущем веке, если SimpleDateFormat (который имеет свои собственные правила для интерпретации строк года) возвращает дату, которая является после текущей даты.
Это гарантировало бы, что все возвращенные даты находятся в прошлом. Однако это не составляет дат, которые могли бы быть проанализированы как перед этим в прошлом веке - например, с форматом MM/dd/yyyy
, строка даты как "01/11/12" анализирует к Jan 11, 12 нашей эры.
Если Время Joda является опцией:
String inputDate = "01/01/08";
// assuming U.S. style date, since it's not clear from your original question
DateTimeFormatter parser = DateTimeFormat.forPattern("MM/dd/yy");
DateTime dateTime = parser.parseDateTime(inputDate);
// if after current time
if (dateTime.isAfter(new DateTime())) {
dateTime = dateTime.minus(Years.ONE);
}
return dateTime.toString("MM/dd/yyyy");
Я знаю, что Время Joda не является частью Java SE, и как я сказал в другом потоке, я обычно не потворствую пользованию сторонней библиотекой, когда существует библиотека Java, которая делает то же самое. Однако человек, который разрабатывает Время Joda, также ведет JSR310 - Дата и время API, это превратит его в Java 7. Так я Время Joda в основном будет в будущих выпусках Java.