Mocking AEM Asset Manager с использованием WCM IO - PullRequest
0 голосов
/ 02 ноября 2018

Я создаю модель стропа, которая извлекает файл Excel из файла для чтения и отображения данных в компоненте AEM.

@Model(
    adaptables = SlingHttpServletRequest.class, 
    defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL
)
public class OnlineCoursesModel {

    @Self
    private SlingHttpServletRequest request;

    @ValueMapValue
    private String filePath;

    private List<OnlineCourseDTO> onlineCourses;

    @PostConstruct
    public void init() {
        AssetManager assetManager = request.getResourceResolver().adaptTo(AssetManager.class);
        Asset asset = assetManager.getAsset(filePath);

        /** Do Something With the Asset **/
    }
}

В AEM все работает нормально, но когда я пытаюсь использовать его с фреймворком AEM WCM.io, assetManager возвращает null.

@Test
public void checkIfFileIsRead() {
    context.load().binaryFile(COURSES_EXCEL_FILE, EXCEL_RESOURCE_PATH);
    context.load().json(ONLINE_COURSE_LISTING_AUTHORED, TEST_CONTENT_ROOT);
    resource = context.request();
    undertest = resource.adaptTo(OnlineCoursesModel.class);

    System.out.println(undertest);
}

1 Ответ

0 голосов
/ 06 ноября 2018

Ваш тест слишком сложен. Можете ли вы попробовать эту более простую версию:

@Test
public void checkIfFileIsRead() {
    context.create().asset("/content/dam/image.jpg", 1, 1, StandardImageHandler.JPEG_MIMETYPE);
    undertest = context.request().adaptTo(OnlineCoursesModel.class);

    assertNotNull(undertest);
}

Это создаст новый актив в /content/dam/image.jpg с шириной 1 и высотой 1 и типом пантомимы image/jpg.

Вам не нужно загружать бинарный и дополнительный json.

Дополнительные примечания

Вам также не нужно адаптироваться из запроса. Это считается плохой практикой и должно выполняться только в том случае, если вам нужна конкретная информация, являющаяся только частью запроса. Например, информация о пользователе, отправляющем запрос.

В противном случае всегда адаптируйтесь с Resource.class.

Пример: * * один тысяча двадцать-одна

@Model(adaptables = Resource.class)
public class OnlineCoursesModel {

    @OSGiService
    private AssetManager assetManager;

    @PostConstruct
    public void init() {
        Asset asset = assetManager.getAsset(filePath);

        /** Do Something With the Asset **/
    }
}
...