Транзакционные тесты с весенней загрузкой и спящим репозиторием jpa - PullRequest
0 голосов
/ 02 января 2019

Я хочу написать транзакционный модульный тест, чтобы изменения были отменены после завершения метода, но я столкнулся с проблемой из-за использования репозиториев hibernate и JPA. По некоторым причинам я получаю UnsupportedOperationException при попытке аннотировать метод @Test с @Transactional
Вот код, в котором я пытаюсь проверить логику удаления потерянных объектов, все в порядке, но я не хочу, чтобы эти объекты в базе данных после завершения метода.

@RunWith(SpringRunner.class)
@SpringBootTest
public class NotificationGroupServiceTest {

  @Autowired
  private NotificationGroupService notificationGroupService;

  private NotificationGroupEntity groupEntity;
  private Long groupId;
  private NotificationCriterionEntity notificationCriterionEntity;
  private HistoricalNotificationEntity historicalNotificationEntity;

  @Before
  public void initializeEntities() {
    groupEntity = new NotificationGroupEntity();

    groupEntity = notificationGroupService.createOrUpdate(groupEntity);
    groupId = groupEntity.getId();

    notificationCriterionEntity = new NotificationCriterionEntity();
    historicalNotificationEntity = new HistoricalNotificationEntity();
    notificationCriterionEntity.setNotificationGroupId(groupId);
    historicalNotificationEntity.setNotificationGroupId(groupId);
    groupEntity.setHistoricalNotifications(Arrays.asList(historicalNotificationEntity));
    groupEntity.setActiveNotificationsList(Arrays.asList(notificationCriterionEntity));
  }

  @Test
  public void testOrphanRemoval() {
    notificationGroupService.createOrUpdate(groupEntity);

    Optional<NotificationGroupEntity> optionalNotificationGroupEntity =
        notificationGroupService.findById(groupId);

    Assert.assertTrue(optionalNotificationGroupEntity.isPresent());

    groupEntity = optionalNotificationGroupEntity.get();

    Assert.assertEquals(1, groupEntity.getActiveNotificationsList()
        .size());
    Assert.assertEquals(1, groupEntity.getHistoricalNotifications()
        .size());
    Assert.assertEquals(groupEntity.getActiveNotificationsList()
        .get(0)
        .getNotificationGroupId(), groupId);
    Assert.assertEquals(groupEntity.getHistoricalNotifications()
        .get(0)
        .getNotificationGroupId(), groupId);

    groupEntity.setActiveNotificationsList(Arrays.asList());
    groupEntity.setHistoricalNotifications(Arrays.asList());

    notificationGroupService.createOrUpdate(groupEntity);

    optionalNotificationGroupEntity =
        notificationGroupService.findById(groupId);

    Assert.assertTrue(optionalNotificationGroupEntity.isPresent());

    groupEntity = optionalNotificationGroupEntity.get();

    Assert.assertEquals(0, groupEntity.getActiveNotificationsList()
        .size());
    Assert.assertEquals(0, groupEntity.getHistoricalNotifications()
        .size());
  }
}

1 Ответ

0 голосов
/ 02 января 2019

Используйте аннотацию @After, чтобы указать метод (ы), который будет запускаться после каждого @Test.

Полный набор аннотаций, подобных этому:

  • @BeforeClass - до того, как все @Tests будут запущены
  • @Before - перед каждым @Test запускается
  • @After - после каждого @Test запускается
  • @AfterClass - после всех @Tests выполнено

Если вы спрашиваете, как связать определенный метод разрыва с конкретным методом @Test, аннотации не нужны: просто вызовите его в конце вашего тестового метода в finally.

И ваш тестовый класс должен быть:

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@ContextConfiguration("classpath:/spring-beans.xml")
public class NotificationGroupServiceTest {
....
}
...