Я пишу несколько модульных тестов JUnit для проверки моего объекта доступа к данным DynamoDB. Вот один из тестов.
....
private static DynamoDBMapper ddbMapper;
@BeforeClass
public static void setup() {
ddbMapper = DynamoDBClients.getTestingDynamoDBMapper();
}
@Before
public void setupTestItem() {
Item item = new Item();
item.setItemID(TEST_COUTSE_ITEM_ID);
// Create an item with every fields populated
ddbMapper.save(item);
}
@Test
public void test_update_simple_attribute() {
Item item = ddbMapper.load(Item.class, TEST_ITEM_ID, TEST_ITEM_VARIANT);
item.setLanguageTag(TEST_LANGUAGE_TAG + "CHANGED");
ddbMapper.save(item);
Item updatedItem = ddbMapper.load(Item.class, TEST_ITEM_ID, TEST_ITEM_VARIANT);
assertEquals(updatedItem.getLanguageTag(), TEST_LANGUAGE_TAG + "CHANGED"); // This field has been changed
}
У меня есть дополнительные тесты, которые будут обновлять элемент и проверять, было ли обновление отправлено в DynamoDB, и я мог бы прочитать его обратно.
Однако я заметил, что если я запускаю эти тесты чаще, я иногда сталкиваюсь с проблемой, что DynamoDB еще не полностью записывает обновленные данные, и когда я загружаю его, он все еще показывает старые данные. Повторный запуск тестов обычно решает проблему.
Я считаю, что DynamoDB использует модель конечной согласованности для записи, поэтому имеет смысл, что иногда обновление может занять немного больше времени, чем скорость выполнения Java. Один из способов смягчить это — приостановить тест JUnit на 100 мс или около того.
Но мне пришлось бы включать некоторый код для приостановки выполнения везде, где я выполняю ddbMapper.save() или ddbMapper.delete(), что не представляется возможным для всех тестов, которые у меня есть, и тестов, которые я напишу.
Кажется, я мог бы решить эту проблему с помощью подхода, основанного на аннотациях. Возможно, реализация аннотации уровня класса @SuspendAtEndOfMethod и всех ее методов может быть затронута, мне интересно, возможно ли это?