Почему метод @Transactional в тестах не ведет себя должным образом?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему метод @Transactional в тестах не ведет себя должным образом?

Сообщение Anonymous »

Я проверяю это:

Код: Выделить всё

@RunWith(SpringRunner.class)
@DataJpaTest
@Import({ OrderService.class, UserService.class })
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class OrderServiceRepositoryIT {

@Autowired
private OrderService orderService;

@Autowired
private UserService userService;

@Autowired
private OrderRepository orderRepository;

@Test
public void testServiceInsertNewOrderWhenRepositorySaveFailsShouldRollbackUserBalance() {
User user = userService.insertNewUser(new User(null, "u1", "n1", "e1", 2000));
Order notSavedOrder = new Order(null, null, 500, user);

assertThatThrownBy(() -> orderService.insertNewOrder(notSavedOrder))
.isInstanceOf(DataIntegrityViolationException.class);

assertThat(orderRepository.findById(notSavedOrder.getId()).orElse(null)).isNull();
assertThat(userService.getUserById(user.getId()).getBalance()).isEqualTo(2000);
}
}
С помощью этого метода из orderService:

Код: Выделить всё

    @Transactional
public Order insertNewOrder(Order order) {
order.setId(null);

try {
userService.withdraw(order.getUser().getId(), order.getPrice());
} catch (IllegalArgumentException | IllegalStateException e) {
throw new IllegalStateException("Unable to insert new order");
}

return orderRepository.save(order);
}
А это от userService:

Код: Выделить всё

    @Transactional
public void withdraw(long id, long amount) {
if (amount < 0) {
throw new IllegalArgumentException("Withdraw amount cannot be negative");
}

User user = userRepository.findById(id).orElse(null);

if (user == null) {
throw new IllegalStateException("User not found");
}

if (user.getBalance() - amount < 0) {
throw new IllegalStateException("Not enough balance to perform withdraw");
}

user.setBalance(user.getBalance() - amount);
userRepository.save(user);
}
Поэтому я проверил это вручную, и если я попытаюсь вставить заказ, который не работает в userRepository.save(user);, действительно произойдет откат. Но в тесте этого не происходит, так как я получаю эту ошибку:

Код: Выделить всё

expected: 2000L
but was: 1500L
Почему?
Я пробую все возможные сценарии, но тест не проходит

Подробнее здесь: https://stackoverflow.com/questions/797 ... d-in-tests
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»