В отличие от @abinmichael, я не предлагаю использовать Spring Runner для запуска этого теста. Ваш тест является модульным тестом, и запуск Spring (создание контекста приложения) является очень дорогой операцией, более подходящей для интеграционного тестирования.
Я не эксперт по mockito, но я считаю, что вам следует немного изменить рефакторингUserServiceImpl
, чтобы зависимости стали видны:
@Service
public class UserServiceImpl {
private final GenericRestClient restClient;
private final RequestMapper requestMapper;
private final ResponseMapper responseMapper;
@Autowired // in recent spring version, this annotation can be omitted
public UserServiceImpl(GenericRestClient restClient, RequestMapper requestMapper, ResponseMapper responseMapper) {
this.restClient = restClient;
this.requestMapper = requestMapper;
this.responseMapper = responseMapper;
}
...
При таком подходе больше нет необходимости в @InjectMocks
:
@RunWith(MockitoJUnitRunner.class)
public class UserServiceImplTest {
@Mock
GenericRestClient restClient;
@Mock
RequestMapper requestMapper;
@Mock
ResponseMapper responseMapper;
UserServiceImpl userService;
@Before
public void init() {
userService = new UserServiceImpl(restClient, requestMapper, responseMapper);
}
....
}
Если вы настаиваете на использовании полейвпрыск, прочитайте Принятый ответ , чтобы получить больше информации о том, как @InjectMocks
работает. Может быть, у вас нет «закрытого» модификатора доступа, может быть, у вас есть некоторая смесь между инжектором «Конструктор» и «Инъекция поля», и @InjectMocks
не поддерживает оба одновременно