Code: Select all
@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);
}
}
Code: Select all
@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);
}
Code: Select all
@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);
}
Code: Select all
expected: 2000L
but was: 1500L
Ich probiere alle möglichen Szenarien aus, aber der Test besteht nicht
Mobile version