模拟购书的场景,书店有书若干本,当把一本书加入购物车,购物车中的书多了一本,而书店中的图书减少一本,这两件事共同构成一个事务。 请建立书店表和购物车表,对上述场景的业务逻辑建模并进行单元测试。 使用javaEE
时间: 2024-10-24 14:04:27 浏览: 45
模拟购书场景,我们首先需要创建两个实体类,分别是`Book`(书店图书)和`CartItem`(购物车项)。然后设计对应的数据库表结构,并编写业务逻辑以及单元测试。
**书店表(BookTable):**
```sql
CREATE TABLE BookTable (
id INT PRIMARY KEY,
title VARCHAR(255),
stock INT NOT NULL DEFAULT 0
);
```
**购物车表(CartTable):**
```sql
CREATE TABLE CartTable (
cart_id INT AUTO_INCREMENT PRIMARY KEY,
book_id INT,
user_id INT,
FOREIGN KEY (book_id) REFERENCES BookTable(id),
quantity INT NOT NULL DEFAULT 0
);
```
**业务逻辑(BooksService.java)**:
```java
@Service
public class BooksService {
@Autowired
private BookRepository bookRepository;
public void addToCart(int bookId, int userId) {
Book book = bookRepository.findById(bookId)
.orElseThrow(() -> new BookNotFoundException(bookId));
if (book.getStock() < 1) {
throw new InsufficientStockException(bookId);
}
// 减少书店库存
book.setStock(book.getStock() - 1);
bookRepository.save(book);
// 添加到购物车
CartItem cartItem = new CartItem();
cartItem.setBookId(bookId);
cartItem.setUserId(userId);
cartItem.setQuantity(1); // 默认数量为1
Cart cart = ... // 获取用户购物车或创建新的
cart.addItem(cartItem);
saveCart(cart); // 存储购物车
}
// 保存购物车逻辑省略
}
```
**单元测试(BooksServiceTest.java):**
```java
@Test
public void testAddToCart() {
// 验证正常添加
Book book = mock(Book.class);
when(book.getId()).thenReturn(1);
when(book.getStock()).thenReturn(3);
// 添加购物车逻辑...
verify(bookRepository).findById(1);
verify(bookRepository).save(book);
verify(cartRepository, never()).updateItem(any());
// 验证库存不足
when(book.getStock()).thenReturn(0);
assertThrows(InsufficientStockException.class, () -> booksService.addToCart(1, 2));
// 验证库存更新
when(book.getStock()).thenReturn(2);
booksService.addToCart(1, 2);
verify(bookRepository).save(book);
verify(cartRepository, times(1)).updateItem(...);
}
// 定义异常处理类
class BookNotFoundException extends RuntimeException {}
class InsufficientStockException extends RuntimeException {}
```
阅读全文