我有一個 Spring Boot 專案,我想測驗一些查詢。我想插入一組預定義的資料并執行存盤庫查詢以檢查結果是否是所需的。
為此,我使用記憶體中的 H2 DB 并且問題(我認為)不存在,與 DB 相關的一切都可以。主要問題是我無法正確模擬EntityManager存盤庫中的欄位,并且查詢始終為空。
我的倉庫是這樣的:
@Repository
public class MyRepositoryImpl implements MyRepository {
@PersistenceContext
private EntityManager entityManager;
@Override
public Result runQuery() {
TypedQuery<Result> query = entityManager.createQuery(
"SELECT ...", Result.class);
return query.setParameter("...", "...") // here 'query' is always null
.setMaxResults(1)
.getResultStream()
.findFirst()
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Entity not found"));
}
}
在測驗之外執行它時效果很好,但是嘗試運行此測驗檔案會引發錯誤:
@RunWith(SpringRunner.class)
public class MyRepositoryTest {
@Mock
EntityManager entityManager;
@InjectMocks
MyRepositoryImpl repository;
@Test
public void it_should_works() {
Result r = repository.runQuery();
assertNull(r);
}
}
存盤庫被模擬并且不為空,我可以呼叫該方法。但是在存盤庫內部,由于query欄位為空,因此NullPointerException嘗試執行時會拋出一個。
我在互聯網上搜索過,我發現了很多方法來測驗界面JPARepository和@Query內部,但不是EntityManager查詢。
我還找到了幾種模擬查詢結果的方法,例如when(runQuery()).thenReturn(result)但我不想要那樣,我在記憶體資料庫中有資料,所以我想執行查詢并獲得結果。
所以,現在,我認為的主要問題是如何EntityManager在存盤庫類中正確模擬物件。
提前致謝。
編輯:
我已經關注了這個鏈接,就像另一個 SO 問題:它只是為了模擬JpaRepository.
我用過這個代碼:
@Test
public void it_should_works() {
Result r = repository.findAll();
assertNotNull(r);
}
并且作業完美,但使用我自己的查詢失敗并出現錯誤:
org.springframework.orm.jpa.JpaSystemException: could not advance using next(); nested exception is org.hibernate.exception.GenericJDBCException: could not advance using next()
...
Caused by: org.h2.jdbc.JdbcSQLNonTransientException: El objeto ya está cerrado
The object is already closed [90007-200]
所以問題是:它與我的資料庫有關?為什么使用 JpaRepository 方法可以,但我自己的查詢不行?
編輯:
解決了添加@Transactional到存盤庫的問題。
uj5u.com熱心網友回復:
由于您使用的是 h2 記憶體資料庫來運行測驗,并且您想在測驗中實際使用該資料庫,因此您不應該真的嘲笑任何東西。
您的模擬不起作用,因為 MyRepositoryImpl 通常由 Spring 初始化,并且該程序比插入 EntityManager 復雜得多。
我認為你想要做的更像是這里描述的https://www.baeldung.com/spring-testing-separate-data-source
因此,您將擁有一個覆寫資料源屬性的 src/test/resources/application.properties 檔案。然后,您只需像往常一樣將您的存盤庫@Autowired 放入您的測驗類中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/390070.html
