Как проверить весенние транзакции - PullRequest
0 голосов
/ 19 ноября 2018

Я работаю над проектом с Spring Boot 2.1.0, и у меня следующая ситуация.

У меня есть следующий репозиторий

@Repository
public interface ActivityRepository extends PagingAndSortingRepository<Activity, Long> {

    @Transactional
    @Modifying
    @Query("") // Imagine a query
    void updateBacklogStatusAge();

    @Transactional
    @Modifying
    @Query("QUERY 2") // Imagine a query
    void updateNextStatusAge();

    @Transactional
    @Modifying
    @Query("QUERY 3") // Imagine a query
    void updateInProgressStatusAge();
}

и следующий компонент

@Component
public class ColumnAgeJob {

    private final ActivityRepository activityRepository;

    public ColumnAgeJob(final ActivityRepository pActivityRepository) {
        activityRepository = pActivityRepository;
    }

    @Transactional
    public void update() {
        activityRepository.updateBacklogStatusAge();
        activityRepository.updateNextStatusAge();
        activityRepository.updateInProgressStatusAge();
    }
}

Теперь я хочу проверить, работает ли транзакционная аннотация.

В основном моя цель состоит в том, чтобы проверить, не вызовет ли исключение runtimeException, возникшее во время вызова updateInProgressStatusAge (), откат модификаций updateNextStatusAge и updateBacklogStatusAge.

Как я могу это сделать?Спасибо

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Вы можете использовать Mockito для изменения поведения вашего сервиса или репозитория с помощью @SpyBean или @ MockBean.

К сожалению, @SpyBean не работает с репозиторием JPA (https://github.com/spring-projects/spring-boot/issues/7033, эта проблемаэто для Spring boot 1.4.1, но у меня та же проблема с 2.0.3.RELEASE)

В качестве обходного пути вы можете создать тестовую конфигурацию для ручного создания макета:

@Configuration
public class SpyRepositoryConfiguration {

   @Primary
   @Bean
   public ActivityRepository spyActivityRepository(final ActivityRepository real) 
      return Mockito.mock(ActivityRepository.class, AdditionalAnswers.delegatesTo(real));
   }
}

И в вашем тесте:

@Autowired
private ActivityRepository activityRepository;
....
@Test
public void testTransactional() {
    Mockito.doThrow(new ConstraintViolationException(Collections.emptySet())).when(activityRepository).updateInProgressStatusAge();

    activityRepository.updateBacklogStatusAge();
    activityRepository.updateNextStatusAge();
    activityRepository.updateInProgressStatusAge();

    // verify that rollback happens
}
0 голосов
/ 19 ноября 2018

Вы можете изменить свой метод для проверки аннотации транзакции.

@Transactional
public void update() {
    activityRepository.updateBacklogStatusAge();
    activityRepository.updateNextStatusAge();
    throw Exception();
    activityRepository.updateInProgressStatusAge();
}

Это будет симулировать желаемый сценарий.

...