2016-07-12 5 views
2

Я пишу блок-тест для одного из моих валидаторов, которые используют тип Integer как зависимость @Autowired.Mockito не может издеваться над примитивными типами

Теперь, во время написания теста я не в состоянии @Mock это как весна говорит -

org.mockito.exceptions.base.MockitoException: 
Cannot mock/spy class java.lang.Integer 
Mockito cannot mock/spy following: 
    - final classes 
    - anonymous classes 
    - primitive types 

Как я должен получить вокруг него?

Мой валидатор выглядит this-

public class MyValidator { 

    @Autowired 
    @Qualifier(value = "intervalInDays") 
    private Integer intervalInDays; // does not get mocked!! 

    @Autowired 
    private LanguageValidator languageValidator; 

    @Autowired 
    private IdValidator idValidator; 

    public void validate(Request request) { 
    //does some validations 

    } 
} 

Тест для этого валидатор класса выглядит this-

@RunWith(MockitoJUnitRunner.class) 
public class MyValidatorTest { 

    @InjectMocks 
    private MyValidator myValidator; //isnt mocked at all 

    @Mock 
    private LanguageValidator languageValidator; //works fine 

    @Mock 
    private IdValidator idValidator; //works fine 

    @Mock(name = "intervalInDays") 
    private Integer intervalInDays; 

//some tests here 
} 

Просьба предложить решение, как intervalInDays не может издеваться со ссылкой на причину указано выше Mockito.

ответ

1

Почему бы вам не создать сеттер для этого атрибута?

Кроме того, вы можете создать конструктор для MyValidator и ввести туда атрибуты Autwired. Это делает тестирование еще более простым.

Пример:

public class MyValidator { 

@Autowired 
public MyValidator(Integer intervalInDays, LanguageValidator languageValidator, IdValidator idValidator) { 
//Set your global attributes 
} 
} 

Here it's explained why @InjectMock is not really a good practice.

+1

Если только для теста, я должен предоставить сеттер, чем почему я буду использовать автоматическое связывание? Это похоже на то, что я даю два способа установить зависимость. – Vishal

+0

Сначала вы можете сделать видимым только ваш сеттер. Во-вторых, это поможет сделать ваш код более легким. На самом деле я никогда не использовал '@ InjectMocks', так как я написал свой код, как будто я могу вводить свои свойства. В-третьих, вы все равно можете пойти на конструктор. – questionare

+0

Кроме того, здесь http://stackoverflow.com/questions/2457239/injecting-mockito-mocks-into-a-spring-bean?rq=1 вы можете увидеть множество способов, как вводить насмешки. – questionare

Смежные вопросы