Аннотирование класса, чтобы каждый его метод мог ждать X мс после выполнения

Я пишу несколько модульных тестов 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 и всех ее методов может быть затронута, мне интересно, возможно ли это?


person Kuangyou Yao    schedule 12.04.2018    source источник
comment
Лучшим подходом было бы как-то программно гарантировать, что DynamoDB закончил запись, если это действительно является причиной. Я считаю, что это не очень хорошая отправная точка при программировании: вам нужно знать наверняка.   -  person SeverityOne    schedule 12.04.2018
comment
@SeverityOne Кажется, я нашел кое-что об использовании строго согласованного чтения в FAQ DynamoDB, автор по умолчанию используется чтение согласованности в конечном итоге. Возможно, мне нужно было бы переключиться на это. Однако меня все еще интересует, возможна ли такая аннотация.   -  person Kuangyou Yao    schedule 12.04.2018
comment
Аннотации немного похожи на обои. На самом деле они не добавляют функциональности вашему коду; они просто позволяют другому коду лучше понимать члены, методы или классы. Таким образом, вам понадобится какой-то агент, который находится между вашими тестовыми классами и тем, что вы используете для их запуска (например, IDE).   -  person SeverityOne    schedule 12.04.2018
comment
Вероятно, вы могли бы найти процессор аннотаций, который позволяет вам манипулировать сгенерированным кодом. На самом деле, вот один: stackoverflow.com/a/13980086/996081   -  person cbr    schedule 12.04.2018