2015-06-25 2 views
1

Я пытаюсь единицу проверить мой класс, используя MockitoJUnitRunner.classMockitoJUnit Test не удалось создать экземпляр объекта Передразнивало

Вот фрагмент кода из моего тестового класса:

@RunWith(MockitoJUnitRunner.class) 
public class AHCLIManagerTest { 

    @Mock 
    RObjectMapper objectMapper; 

    @Mock 
    AHCLIUpdateCommand ahcliUpdateCommandMock; 

    @InjectMocks 
    AHCLIManager underTest; 

И в моем главном классе , у меня есть:

@Service 
public class AHCLIManager implements ProductionUpdateManager { 

    @Autowired 
    private RObjectMapper objectMapper; 

    @Autowired 
    private AHCLIUpdateCommand ahcliUpdateCommand; 

Когда я пытаюсь прочитать объект из строки JSON с помощью объекта картографа, следующим образом, я получаю NullPointerException

JsonNode rootNode = objectMapper.readTree(requestJSON); 

Я пытался использовать ReflectionTestUtils инициализировать ObjectMapper из класса Test, как показано ниже, и тест прошел

ReflectionTestUtils.setField(underTest, "objectMapper", new RObjectMapper()); 

EDIT:

Кроме того, я использую MockitoAnnotations.initMocks() следующим образом:

@Before 
public void setUp() { 
    MockitoAnnotations.initMocks(this); 
} 

Я не уверен, почему инъекция Mock не работает.

+0

Вы уверены, что это не сработало на 'objectMapper.readTree'? Или это не работает в строке, использующей 'rootNode'? Ответ по умолчанию на метод - это возврат 'null', если вы ничего не указали. Если вы используете новый экземпляр объекта (как вы делаете с 'ReflectionTestUtils', если, конечно, удастся, когда вы вводите полный экземпляр вместо макета. –

+0

@ M.Deinum Спасибо, что спустили меня. Когда я ответил на этот вопрос 6 часов назад (через 5 минут после публикации) OP не показывал каких-либо доказательств, вызываемых 'initMocks()', поэтому мой ответ. –

+1

Как я уже упоминал в комментарии, вам не нужно, чтобы из-за использования runner, 'initMocks' нужен только, если вы не можете использовать runner. –

ответ

0

У вас есть соответствующие сеттеры в вашем AHCLIManager?

Что делает @InjectMocks, если я правильно помню, это просто впрыскивание через сеттеры с подходящим типом макетного объекта, объявленного @Mock. Mockito ничего не делает на базе @Autowired.

(Это не имеет ничего общего с использованием MockitoJUnitRunner или позвонив по телефону MockitoAnnotations.initMocks() так или иначе)

Другая возможность заключается в том, что вы, возможно, создали экземпляр AHCLIManager в методе установки. Mockito собирается создать экземпляр AHCLIManager для вас, если вы его аннотировали @InjectMocks

0

Вы используете разные стратегии для создания макетов. Вы должны либо использовать метод MockitoJUnitRunner, либо метод MockitoAnnotations.initMocks.

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