2013-12-12 2 views
0

Я получил три класса A, B и C:Mockito не может создать экземпляр класса испытываемого

public class A { 
    @Autowired 
    private B someB; 
    private C someC = someB.getSomeC(); 
} 

@Service 
public class B { 
    C getSomeC() { 
    return new C(); 
    } 
} 

public class C { } 

Теперь, если я пишу модульный тест для A который выглядит как:

@RunWith(MockitoJUnitRunner.class) 
public class ATest { 

    @InjectMocks 
    private A classUnderTest; 

    @Mock 
    private B someB; 

    @Mock 
    private C someC; 

    @Test 
    public void testSomething() { 

    } 
} 

Mockito недовольны этим:

org.mockito.exceptions.base.MockitoException: 
    Cannot instantiate @InjectMocks field named 'classUnderTest' of type 'class my.package.A'. 
    You haven't provided the instance at field declaration so I tried to construct the instance. 
    However the constructor or the initialization block threw an exception : null 

Если я удалить вызов в классе A, такой, что класс A выглядит следующим образом:

public class A { 
    private B someB; 
    private C someC; 
} 

, Mockito способен создать экземпляр classUnderTest и тест проходит через.

Почему это так?

редактировать: Использование Mockito 1.9.5

ответ

4

Ну это всегда происходит сбой:

public class A { 
    private B someB; 
    private C someC = someB.getSomeC(); 
} 

Вы пытаетесь вызвать getSomeC() на значение, которое будет всегда быть null ... это всегда будет выброшено NullPointerException. Вам нужно исправить A, чтобы лучше обрабатывать зависимости. (Лично я принимаю их как параметры конструктора, но есть и другие варианты, конечно ...)

+0

Я забыл добавить весенние аннотации, некоторые из них АВВ, см. Выше. – ptikobj

+0

@ptikobj: Ну, это не будет autowired * до запуска инициализаторов переменной экземпляра * не так ли? И даже если Spring удалось автоповернуть поле 'someB' до того, как инициализатор' someC' каким-то образом выполнился, что заставляет вас думать, что Mockito сможет выполнить тот же трюк? Я не думаю, что это хорошая идея иметь класс, в котором вы просто не можете вызвать конструктор, как правило, без его исключения ... –

+0

Мне не было известно о порядке запуска autowiring vs constructor. Это также обсуждается, например. [Здесь] (http://stackoverflow.com/questions/6335975/autowired-bean-is-null-when-referenced-in-the-constructor-of-another-bean). – ptikobj

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