Проблема, с которой вы сталкиваетесь, связана с использованием аннотации @InjectMocks
. @InjectMocks
отмечает поле, в которое необходимо выполнить инъекцию.В этом порядке Mockito попытается внедрить макеты только с помощью инжектора конструктора, метода инсталляции или свойства.Если какая-либо из указанных стратегий внедрения не удалась, Mockito не будет сообщать о сбое.
Таким образом, в вашем случае, когда вы пытаетесь внедрить ложные сообщения, присутствует только один пробный компонент, а другой - ServiceA -не вводится. Для решения этой проблемы:
Вы можете попробовать вообще не использовать @InjectMocks
, а вместо этого передавать фиктивный объект для метода, который вы хотите смоделировать, в то время как передайте остальные объекты с автопроводкой в конструктор. Пример:
Здесь, чтобы проверить, я передаю один фиктивный объект и один объект с автопроводкой.
@RunWith(MockitoJUnitRunner.class)
public class SampleTestServiceImplTest {
@Mock
private SampleClient sampleClient;
@Autowired
private BackendService backendService ;
private BackendServiceImpl backendServiceimpl;
@Before
void setUp() {
backendServiceimpl = new BackendServiceImpl(sampleClient, backendService);
}
Или другой способ сделать эту работу - использовать аннотацию @Autowired
вместе с @InjectMocks.@Autowired @InjectMocks
используются вместе, и то, что он будет делать, это внедрить макетированный класс, а аннотация Autowired добавляет любую другую зависимость, которую может иметь класс.
Ответ ссылается на: https://medium.com/@vatsalsinghal/autowired-and-injectmocks-in-tandem-a424517fdd29