我正在嘗試測驗具有以下測驗類的實作 JpaRepository 的用戶的存盤庫層:
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.runner.RunWith;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
@ExtendWith({MockitoExtension.class, SpringExtension.class})
@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@BeforeEach
void initUseCase() {
User user1 = new User(null, "First N1", "Last N1", "[email protected]", "password", UserRole.USER,
null,
false, true);
User user2 = new User(null, "First N2", "Last N2", "[email protected]", "password", UserRole.USER,
null,
false, true);
User user3 = new User(null, "First N3", "Last N3", "[email protected]", "password", UserRole.USER,
null,
false, true);
List<User> users = Arrays.asList(user1, user2, user3);
userRepository.saveAllAndFlush(users);
}
@AfterEach
public void destroyAll(){
userRepository.flush();
userRepository.deleteAll();
}
// READ
@Test
@Transactional
void testFindById_Success() {
assertTrue(userRepository.findById(1L).isPresent());
assertEquals("First N1", userRepository.findById(1L).get().getFirstName());
}
@Test
@Transactional
void testFindAll_Success() {
assertEquals(3, this.userRepository.findAll().size());
}
// CREATE
@Test
@Transactional
void testCreateUser_Success() {
User user =
new User(4L, "First N4", "Last N4", "[email protected]", "password", UserRole.USER, null, true, true);
userRepository.save(user);
assertEquals(4, userRepository.findAll().size());
}
}
如果我一個一個地運行它們,所有三個都通過。一旦我將整個課程作為一個整體運行,帶有 FindById 的課程總是會失敗,因為它表明找不到該專案。有人可以解釋為什么它會這樣以及我做錯了什么嗎?

uj5u.com熱心網友回復:
因為您有一個自動遞增的 id,所以您會為每個測驗用例獲得新的 id。
你有兩種可能讓你的測驗用例作業。
首先:用 注釋 initUseCase @BeforeAll,以便您只插入一次資料。
@BeforeAll
static void initUseCase() {
User user1 = new User(null, "First N1", "Last N1", "[email protected]", "password", UserRole.USER,
null,
false, true);
User user2 = new User(null, "First N2", "Last N2", "[email protected]", "password", UserRole.USER,
null,
false, true);
User user3 = new User(null, "First N3", "Last N3", "[email protected]", "password", UserRole.USER,
null,
false, true);
List<User> users = Arrays.asList(user1, user2, user3);
userRepository.saveAllAndFlush(users);
}
第二:您可以將保存的物體存盤在變數中并針對它們:
List<User> entities;
@BeforeEach
void initUseCase() {
User user1 = new User(null, "First N1", "Last N1", "[email protected]", "password", UserRole.USER,
null,
false, true);
User user2 = new User(null, "First N2", "Last N2", "[email protected]", "password", UserRole.USER,
null,
false, true);
User user3 = new User(null, "First N3", "Last N3", "[email protected]", "password", UserRole.USER,
null,
false, true);
List<User> users = Arrays.asList(user1, user2, user3);
entities = userRepository.saveAllAndFlush(users);
}
@Test
@Transactional
void testFindById_Success() {
assertTrue(userRepository.findById(entities.get(0)).isPresent());
assertEquals("First N1", userRepository.findById(1L).get().getFirstName());
}
uj5u.com熱心網友回復:
問題是每次觸發 @BeforeAll 時它都會生成新的 Id。一旦我將 findById 中的 ID 更改為 4,它就會找到匹配項。
解決這個問題的一種方法是添加以下注釋:
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
uj5u.com熱心網友回復:
首先,JUnit 方法不會遵循測驗方法的宣告順序。您可以嘗試在失敗的測驗用例之前添加插入陳述句。或者userRepository.deleteAll();從方法中洗掉該陳述句destroyAll()以避免在每個測驗用例完成后洗掉所有條目。@AfterEach請參考JUnit 測驗用例執行序列的行為,并確定避免此問題的方法。
參考:
https://junit.org/junit5/docs/5.0.1/api/org/junit/jupiter/api/AfterEach.html
https://www.baeldung.com/junit-5-test-order
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/513212.html
