Если вы используете @Autowired
в классе C, этот C должен управляться Spring, иначе "autowiring magi c D внутри C не произойдет"
Но если да, то зачем вы создаете новый экземпляр C в классе toBeTested
? На самом деле это не имеет смысла.
Итак, вам следует:
- Поместить
@Component
в класс C, чтобы Spring справился с этим. - Изменить class
toBeTested
:
@Component
class toBeTested{
@Autowired private A a;
@Autowired private B b;
@Autowired private C c;
public C methodToBeTested(){
return c.fun();
}
}
Довольно странно видеть c .fun (), который возвращает сам себя, это строитель или что-то в этом роде? Возможно, вам стоит сделать его «прототипом», и тогда решение будет немного другим, но, поскольку оно не упомянуто в вопросе, у меня недостаточно деталей, поэтому я оставлю ответ как есть ...
Обновление 1
Теперь, когда ясно, что класс C по причинам, не зависящим от OP, не управляется Spring, есть два варианта:
Используйте PowerMock / Power Mockito, если вам нужно сохранить класс toBeTested
в его текущей форме (с new C() in the method to be tested
. Этот подход в целом считается плохой практикой, используйте его только в том случае, если у вас нет другого выбора. Эти инструменты могут имитировать создание объекта (новый) и заменять C какой-нибудь заглушкой на лету.
Если вы можете изменить класс toBeTested
- используйте инъекцию зависимостей:
public class ToBeTested {
@Autowired private A a;
@Autowired private B b;
@Autowired private CFactory cFactory;
public C methodToBeTested() {
return cFactory.create(a.getD()).fun();
}
}
interface CFactory {
C create(D d);
}
@Component
public class DefaultCFactoryImpl implements CFactory {
public C createC(D d) {
return new C(d);
}
}
Этот подход намного лучше, поскольку он позволяет заменить фабрику реализацией, которая создаст имитацию C или того, что вы сочтете подходящим для теста.