Warum verhält sich die @Transactional-Methode in Tests nicht wie erwartet?Java

Java-Forum
Anonymous
 Warum verhält sich die @Transactional-Methode in Tests nicht wie erwartet?

Post by Anonymous »

Ich teste das:

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);
}
}
Mit dieser Methode von orderService:

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);
}
Und dieses hier von userService:

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);
}
Also habe ich das manuell getestet und wenn ich versuche, eine Bestellung einzufügen, die in userRepository.save(user); fehlschlägt, findet tatsächlich ein Rollback statt. Im Test ist dies jedoch nicht der Fall, da ich diesen Fehler erhalte:

Code: Select all

expected: 2000L
but was: 1500L
Warum?
Ich probiere alle möglichen Szenarien aus, aber der Test besteht nicht

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post