我遇到了一個名為“無法實體化名為 'userService' 型別的 'UserServiceImpl' 的 @InjectMocks 欄位的模擬測驗的問題。您沒有在欄位宣告時提供實體,所以我嘗試構建實體。” 我一直在通過 stackoverflow 進行搜索,但不幸的是我還沒有找到適合自己的解決方案。所以,我有介面'UserService',它的實作和我想測驗的幾個方法。
用戶服務:
public interface UserService {
Optional<User> getByToken(String token);
PagingDto<User> getUsers(String filter, Integer startIndex, Integer count);}
用戶服務實作:
public class UserServiceImpl extends AbstractPagingService<User, Integer, UserEntity> implements UserService {
private final UserRepository userRepository;
@Autowired
public UserServiceImpl(ProviderConfiguration providerConfiguration, UserRepository userRepository) {
super(providerConfiguration.getFilter().getMaxResult(), userRepository, Sort.by("surname"));
this.userRepository = userRepository;
}
four methods
測驗類:
@ExtendWith(SpringExtension.class)
class UserServiceImplTest {
private static final String TOKEN = "token";
@InjectMocks
private UserServiceImpl userService;
@Spy
private UserRepository userRepository;
@Test
void testGetByToken() {
final UserEntity userEntity = new UserEntity();
final int id = 1;
final User expectedUser = new User();
final String email = "[email protected]";
final String surname = "surname";
final String name = "name";
final String patronymic = "patronymic";
userEntity.setId(id);
expectedUser.setId(id);
expectedUser.setEmail(email);
expectedUser.setSurname(surname);
expectedUser.setName(name);
expectedUser.setPatronymic(patronymic);
when(userRepository.findById(id)).thenReturn(Optional.of(userEntity));
final User actualUser = userService.getByToken(TOKEN).orElseThrow();
assertEquals(expectedUser, actualUser);
assertEquals(email, userEntity.getEmail());
assertEquals(surname, userEntity.getSurname());
assertEquals(name, userEntity.getName());
assertEquals(patronymic, userEntity.getPatronymic());
}
@Test
void testGetAbsentUserByToken() {
assertFalse(userService.getByToken(TOKEN).isPresent());
}
@Test
void testEmptyUser() {
when(userRepository.findById(any())).thenThrow(IllegalArgumentException.class);
assertFalse(userService.getByToken(TOKEN).isPresent());
}
如果我沒有擴展 AbstractPagingService<User, Integer, UserEntity>,一切都很好。但如果我這樣做,總會有我上面提到的錯誤。
uj5u.com熱心網友回復:
您缺少一個模擬,ProviderConfiguration它是您的服務所需的依賴項。
@ExtendWith(SpringExtension.class)
class UserServiceImplTest {
private static final String TOKEN = "token";
@InjectMocks
private UserServiceImpl userService;
@Spy
private UserRepository userRepository;
@Mock
private ProviderConfiguration providerConfiguration;
可能需要更多步驟才能正確設定,包括getFilter()模擬或通過模擬回傳模擬(通常不鼓勵)。
如果ProviderConfiguration是一個沒有太多邏輯的資料類,請考慮在您的測驗中分配一個真實的配置:
@ExtendWith(SpringExtension.class)
class UserServiceImplTest {
private static final String TOKEN = "token";
private ProviderConfiguration providerConfiguration = createTestProviderConfiguration();
@InjectMocks
private UserServiceImpl userService;
@Spy
private UserRepository userRepository;
private static ProviderConfiguration createTestProviderConfiguration() {
final Filter filter = new Filter();
filter.setMaxResult(42);
final ProviderConfiguration cfg = new ProviderConfiguration();
cfg.setFilter = filter;
return cfg;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/520986.html
標籤:爪哇休息测试模仿者
下一篇:在這種情況下,如何使用Jest監視第二個函式object.functionOne().functionTwo()
