在前面的文章中,我們已經測試了 Service
和 Controller
的部分
今天要來看 Repository
(Spring Boot JPA
) 的部分,探討如何進行測試
我們會使用 Spring 框架提供給我們的 DataJpaTest
這個工具,它專門用於測試 Spring Boot JPA
相關的組件
它的主要目的是讓開發者能夠輕鬆地測試資料庫操作
,而無需設置完整的 Spring 應用程式
記憶體
(H2)Hibernate
、Spring Data
和 DataSource
@Entity
類別的掃描SQL 日誌記錄
使用 @DataJpaTest
這個註解即可,它會設定好相關的測試試環境
預設使用記憶體資料庫
,如果要使用實際的資料庫,可以用下面的註解
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
每個測試方法結束後會自動回滾交易
,確保測試之間的獨立性,不過還是需要自己控制相關的測試資料
一樣先在 test
的 package 裡面,建立相對應的 repository
package,然後建立一個 TodoRepositoryTest
的測試類別
我們將測試 TodoRepository
自定義的查詢方法
和 JPQL 方法
@DataJpaTest
public class TodoRepositoryTest {
@Autowired
private TodoRepository todoRepository;
@BeforeEach
public void setup() {
// 在每個測試方法執行前,先清空所有的資料,確保每個測試方法都有一致的初始狀態
todoRepository.deleteAll();
// 新增測試資料
todoRepository.saveAll(Arrays.asList(
new Todo(null, "買牛奶", false),
new Todo(null, "寫程式", true),
new Todo(null, "看書", false)
));
}
@Test
public void testFindByTitle() {
List<Todo> todos = todoRepository.findByTitle("買牛奶");
assertEquals(1, todos.size());
assertEquals("買牛奶", todos.get(0).getTitle());
}
@Test
public void testFindByCompletedTrue() {
List<Todo> completedTodos = todoRepository.findByCompletedTrue();
assertEquals(1, completedTodos.size());
assertTrue(completedTodos.get(0).isCompleted());
}
@Test
public void testFindByTitleContainingOrderByIdDesc() {
List<Todo> todos = todoRepository.findByTitleContainingOrderByIdDesc("寫");
assertEquals(1, todos.size());
assertEquals("寫程式", todos.get(0).getTitle());
}
@Test
public void testCountByCompletedFalse() {
long count = todoRepository.countByCompletedFalse();
assertEquals(2, count);
}
@Test
public void testFindAllWithPagination() {
Page<Todo> todoPage = todoRepository.findAll(PageRequest.of(0, 2));
assertEquals(2, todoPage.getContent().size());
assertEquals(3, todoPage.getTotalElements());
}
}
執行測試時,可以看到相關的 SQL Script
使用 @DataJpaTest
進行 Spring Data JPA
的測試是一種高效且可靠的方法
它允許我們專注於測試 資料庫的操作
,而無需處理完整的應用程式
通過編寫全面的測試案例,我們可以確保 Repository
的正確性,尤其是相關的自定義的 查詢方法
和 JPQL 方法
這不僅能提高程式碼的可靠性,還能在進行重構或優化時提供安全保障
同步刊登於 Blog 「Spring Boot API 開發:從 0 到 1」Day 28 DataJpaTest 測試
我的粉絲專頁
圖片來源:AI 產生