我正在學習 spring boot 測驗,我有這個測驗:
@ExtendWith(MockitoExtension.class)
@SpringBootTest
class AppUserServiceTest {
@Mock
private UserRepository repository;
private UserService userService;
@BeforeEach
void setUp() {
userService = new UserService(repository);
}
@Test
void itShouldLoadUsernameByName() {
AppUser appUser = new AppUser(
ApplicationRole.USER,
"leonardo",
"rossi",
"leo__",
"[email protected]",
"password"
);
repository.save(appUser);
userService.loadUserByUsername(appUser.getUsername());
verify(repository).searchByUserName(appUser.getUsername());
}
}
它一直向我拋出例外,因為它在資料庫中找不到任何用戶,事實上,即使我將用戶保存在 repository.findAll() 回傳 0 元素。
這是我要測驗的用戶服務:
@AllArgsConstructor
@Service
public class UserService
implements UserDetailsService {
private final UserRepository repository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return repository.searchByUserName(username)
.orElseThrow(
()-> new UsernameNotFoundException("The username " username " has not been found")
);
}
這是我用于測驗配置的 H2 資料庫:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
uj5u.com熱心網友回復:
模擬只是模擬。它從來沒有真正做某事。它可以表現得像一個真實的東西,但你必須告訴 mock 如何去做。
因此,如果您模擬 UserRepository 并嘗試保存某些內容,則什么也不會發生。因為再一次,模擬從來沒有真正做某事。這樣做的好處是您實際上不需要整個基礎設施來對一個小方法進行單元測驗。此外,測驗獨立于資料。您現在可以做的是在呼叫某些方法時回傳一些資料。
在您的情況下,您不需要整個資料庫來測驗 UserService 的功能。因此模擬存盤庫是一個不錯的選擇。現在因為它是一個模擬,你必須告訴模擬如何為你的測驗用例表現:
@Test
void itShouldLoadUsernameByName() {
AppUser appUser = new AppUser(
ApplicationRole.USER,
"leonardo",
"rossi",
"leo__",
"[email protected]",
"password"
);
when(standortRepository.searchByUserName(any())).thenReturn(appUser);
userService.loadUserByUsername(appUser.getUsername());
//More expectations ...
verify(repository).searchByUserName(appUser.getUsername());
}
現在我所做的是告訴模擬它應該在呼叫方法時回傳 appUser loadByUsername。
Ps 這些是我使用的靜態匯入:
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/534830.html
