Mockito не может вводить насмешки - PullRequest
0 голосов
/ 08 июля 2019

Я использую Mockito и пытаюсь внедрить Mock CustomFileHandler в мой класс REjercicioDAO для целей тестирования.Дело в том, что мой тест не выдает никаких исключений, но он не внедряет мой фиктивный объект, оригинальный @Autowired CustomFileHandler не заменяется.Вот мой код:

@Repository
public class REjercicioDAO extends ARHibernateDAO < REjercicio > implements IREjercicioDAO {

    @Autowired
    public ICustomFileHandler customFileHandler;

    ...

}

А вот мой тест:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ATest.CONTEXT_CONFIGURATION)
public class REjercicioDAOTest extends ATest {

    @Mock private ICustomFileHandler customFileHandler;

    @Autowired
    @InjectMocks
    private IREjercicioDAO rEjercicioDAO;

    @Before
    public void before () {

        MockitoAnnotations.initMocks(this);

        ...

    }

Кстати, сущности работают как положено, и интерфейсы правильно связаны с реальными сущностями, я это проверял.Как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Здесь нет ответа.Я не мог дать больше, потому что мне очень жаль видеть, что так много людей используют этот неуклюжий API, полагаясь на рефлексию, в то время как вы могли бы сделать вещи, действительно понятные для читателей класса, явно установив зависимость.

Дело в том, что мой тест не выдает никаких исключений, но он не вводит мой фиктивный объект

Не удивительно.Этот способ впрыскивания макета остается тихим, даже если инъекция не удалась. Из InjectMocks javadoc (выделение не мое!):

Mockito будет пытаться внедрить mock только путем инжекции конструктора, инжектора сеттера или свойства в порядке икак описано ниже.Если какая-либо из следующих стратегий потерпит неудачу, Mockito не сообщит о неудаче; , то есть вам придется самостоятельно предоставлять зависимости.

Хотя Mockito не сообщает о сбое, я действительно не рекомендую использовать этот API.

По поводу вашей реальной проблемы посмотрите на это:

@Autowired
@InjectMocks
private IREjercicioDAO rEjercicioDAO;

Вы аннотируете поле с помощью аннотаций Spring и Mockito.Вы чувствуете себя комфортно с порядком их обработки?Они приходят из двух разных библиотек.Я не говорю, что это никогда не сработает (удача и случайность существуют), но вы действительно думаете, что это надежно?

Чтобы выполнить ваше требование, вы могли бы написать что-то подобное, что делает вещи в два явных шага:
- создание объектов: макетирование зависимости и вставка пружинной зависимости
- набор отношений: между ложной зависимостьюи пружинная зависимость

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ATest.CONTEXT_CONFIGURATION)
public class REjercicioDAOTest extends ATest {

    @Mock 
    private ICustomFileHandler customFileHandler;

    @Autowired        
    private IREjercicioDAO rEjercicioDAO;

    @Before
    public void before () {    
        MockitoAnnotations.initMocks(this);
        // Set explicitly the fileHandler dependency
        rEjercicioDAO.setFileHandler(customFileHandler);         
    }
 }
1 голос
/ 08 июля 2019

Вы пытаетесь смешать ИТ с модульным тестом.

1) Если вы используете Spring Boot:

@MockBean
private ICustomFileHandler customFileHandler;

@Autowired
private IREjercicioDAO rEjercicioDAO;

Вот так ..

2) Не используется Spring Boot:

public class TestConfig{

    @Bean
    @Primary
    public ICustomFileHandler customFileHandler(){
       return Mockito.mock(ICustomFileHandler.class);
    }

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ATest.CONTEXT_CONFIGURATION, classes=TestConfig.class)
public class REjercicioDAOTest extends ATest {

   @Autowired
   private ICustomFileHandler customFileHandlerMock; 

    @Autowired
    private IREjercicioDAO rEjercicioDAO;

Макет вводится, и вы можете настроить его в своем тесте так, как вам нравится

...