Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: wbillerОтветов: 1

Есть ли способ внедрить объекты без издевательств с помощью @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...
}
  • Вы пытались создать поле в тестовом классе для UserRepository с аннотациями Autowired и Spy? Dev Blanked 03.12.2013
  • Да, на самом деле это сработало, но я не хочу объявлять каждую зависимость в тесте. wbiller 04.12.2013

javaunit-testingspringspring-datamockito

Ответы

Ответ 1 · Karthik Prasad

Вам нужно инициализировать ваш 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);
    }
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы