ApplicationContext.Current
всегда будет null в этом случае, потому что ApplicationContext.Current
ссылается на текущий исполняемый экземпляр приложения Umbraco. Для того, чтобы иметь исполняемый экземпляр, вам нужна полная установка Umbraco, настроенная, загруженная и запущенная.
Не думаю, что вы сможете сделать это с помощью Umbraco.Core
самостоятельно и добавить все эти дополнительные библиотеки для в любом случае, для соединения с базой данных.
Если вам нужно получить доступ к конкретному содержимому базы данных Umbraco, лучшим вариантом будет добавить Umbraco Api Controller в фактический экземпляр Umbraco и выставить данные, которые вам нужны с помощью Web API.
При нажатии вы можете напрямую подключиться к базе данных, но база данных хорошо абстрагируется и нормализуется, поэтому, если вам не нужны только очень конкретные данные из базы данных, это не будет стоить усилий.
Вы смешиваете два способа внедрения зависимости ( https://en.wikipedia.org/wiki/Dependency_injection#Three_types_of_dependency_injection ). Вы должны создать правильный конструктор, и только этот construstor должен быть @Autowired. Ваш класс должен выглядеть примерно так:
private Source source;
private AWSProperties awsProperties;
private AuditRepository auditRepository;
private AmazonSQS sqs;
@Autowired
public SqssreaderApplication(Source source, AWSProperties awsProperties, AuditRepository auditRepository, AWSConfig awsConfig) {
this.sqs = awsConfig.generateSQS();
Затем в своем тесте вы можете изменить свой подход # 1 и добавить все необходимые макеты через конструктор. Небольшой оффтоп: вы используете AWSProperties как в классах AWSConfig, так и в классах SqssreaderApplication. Проверьте, действительно ли вам это нужно в SqssreaderApplication.
AmazonSQS
также является пружинным бобом, который можно вводить с помощью @Autowired
. Таким образом, вы можете изменить конструктор с
@Autowired
public SqssReadderApp(AWSConfig awsConfig) {
this.sqs = awsConfig.generateSQS();
}
на
@Autowired
public SqssReadderApp(AmazonSQS sqs) {
this.sqs = sqs;
}
Теперь вы можете добавить свой макетный экземпляр в конструктор.
Вам также следует рассмотреть возможность устранения этой комбинации инжекции поля и инжектора конструктора. Я рекомендую инъекцию в конструктор, которая значительно облегчает тестирование.
public class SqssReadderApp {
@Autowired
public SqssReadderApp(Source source, AWSProperties awsProperties, AuditRepository auditRepository, AmazonSQS sqs) {
//
}
}
См. Также , почему полевая инъекция является злой .