Я получил три класса 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
Я забыл добавить весенние аннотации, некоторые из них АВВ, см. Выше. – ptikobj
@ptikobj: Ну, это не будет autowired * до запуска инициализаторов переменной экземпляра * не так ли? И даже если Spring удалось автоповернуть поле 'someB' до того, как инициализатор' someC' каким-то образом выполнился, что заставляет вас думать, что Mockito сможет выполнить тот же трюк? Я не думаю, что это хорошая идея иметь класс, в котором вы просто не можете вызвать конструктор, как правило, без его исключения ... –
Мне не было известно о порядке запуска autowiring vs constructor. Это также обсуждается, например. [Здесь] (http://stackoverflow.com/questions/6335975/autowired-bean-is-null-when-referenced-in-the-constructor-of-another-bean). – ptikobj