Есть ли другой подход, чтобы смоделировать этот вызов метода в конструкторе

ApplicationContext.Current всегда будет null в этом случае, потому что ApplicationContext.Current ссылается на текущий исполняемый экземпляр приложения Umbraco. Для того, чтобы иметь исполняемый экземпляр, вам нужна полная установка Umbraco, настроенная, загруженная и запущенная.

Не думаю, что вы сможете сделать это с помощью Umbraco.Core самостоятельно и добавить все эти дополнительные библиотеки для в любом случае, для соединения с базой данных.

Если вам нужно получить доступ к конкретному содержимому базы данных Umbraco, лучшим вариантом будет добавить Umbraco Api Controller в фактический экземпляр Umbraco и выставить данные, которые вам нужны с помощью Web API.

При нажатии вы можете напрямую подключиться к базе данных, но база данных хорошо абстрагируется и нормализуется, поэтому, если вам не нужны только очень конкретные данные из базы данных, это не будет стоить усилий.

0
задан KumarAnkit 20 January 2019 в 07:42
поделиться

2 ответа

Вы смешиваете два способа внедрения зависимости ( 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.

0
ответ дан Ruku 20 January 2019 в 07:42
поделиться

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) {
        //
    }
}

См. Также , почему полевая инъекция является злой .

0
ответ дан Roland Weisleder 20 January 2019 в 07:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: