@InjectMocks и объекты без макетов (хранилища данных Spring)

Есть ли способ внедрить объекты без издевательств с помощью @InjectMocks?

Моя установка имеет UserSignupService с зависимостями от MailService и UserRepository (репозиторий данных Spring). У меня есть модульный тест, создающий шпиона MailService, и я аннотировал UserSignupService с помощью @InjectMocks. К сожалению, это не будет внедрять UserRepository (не издевательский) в класс обслуживания. Объединение @InjectMocks с @Autowired приведет не к внедрению фиктивного MailService, а к bean-компоненту из контекста приложения.

MockitoAnnotations.initMocks() запускается в AbstractServiceTest.setUp(). Этот класс также содержит конфигурацию модульного теста (SpringJunit4TestRunner и т. д.)

public class UserSignupServiceTest extends AbstractServiceTest {

  @Autowired @Spy
  private MailService<UserActivationMail> mailService;

  @InjectMocks
  private UserSignupServiceImpl service;

  @Before
  public void setUp() throws Exception {
    super.setUp();
  }
}

@Service
public class UserSignupServiceImpl implements UserSignupService {

  private final UserRepository repository;
  private final MailService<UserActivationMail> mailService;

  @Autowired
  public UserSignupServiceImpl(UserRepository repository,
                               MailService<UserActivationMail> mailService) {
    this.repository = repository;
    this.mailService = mailService;
  }
  //methods...
}

person wbiller    schedule 03.12.2013    source источник
comment
Вы пытались создать поле в тестовом классе для UserRepository с аннотациями Autowired и Spy?   -  person Dev Blanked    schedule 03.12.2013
comment
Да, на самом деле это сработало, но я не хочу объявлять каждую зависимость в тесте.   -  person wbiller    schedule 04.12.2013


Ответы (1)


Вам нужно инициализировать ваш Mockito MockitoAnnotations.initMocks(this);

Вот пример тестового класса Spring JUnit, который у меня есть

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:config/spring-context.xml" })
public class SpringKPTest {

    @Autowired
    SomeClassA SomeClassA;

    @Mock
    SomeClassB SomeClassB;



    @Before
    public void init(){
        MockitoAnnotations.initMocks(this);
    }
}
person Karthik Prasad    schedule 03.12.2013
comment
На самом деле, если у вас есть аннотация @RunWith(SpringJUnit4ClassRunner.class)', вам не нужно добавлять MockitoAnnotations.initMocks(this); инициализации вашего кода, пожалуйста, проверьте stackoverflow.com/questions/ 10806345/ - person erhun; 03.12.2013
comment
Как уже было сказано, я это уже сделал. Базовая настройка в порядке и работает так, как должна. Mockito шпионит за MailService. Речь идет о том, как получить объект без макета из контекста приложения для внедрения с помощью @InjectMocks. - person wbiller; 03.12.2013