


hi I have the following model class :
@Model(
adaptables = SlingHttpServletRequest.class,
defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class LocationsModel extends ComponentModel implements Validatable {
private static final Logger log = LoggerFactory.getLogger(LocationsModel.class);
private static final String CSS_CLASS_NAME = "locations";
@OSGiService
private GoogleMapAPIConfiguration mapAPIConfiguration;
@ValueMapValue
private String title;
@ValueMapValue
private int zoomLevel;
@ChildResourceFromRequest
private final List<LocationItem> locations = emptyList();
private String locationsJson;
private String key;
public LocationsModel() {
}
@PostConstruct
protected void init() {
if (mapAPIConfiguration != null) {
this.key = mapAPIConfiguration.getKey();
}
try {
this.locationsJson = new ObjectMapper().writeValueAsString(this.locations);
} catch (JsonProcessingException ex) {
log.error("Unable to generate locations to JSON string", ex);
}
}
@Nonnull
@Override
public String getCssClassName() {
return CSS_CLASS_NAME;
}
@Override
public boolean isValid() {
return StringUtils.isNotEmpty(this.key) && !this.locations.isEmpty();
}
public String getTitle() {
return this.title;
}
@Nonnull
public List<LocationItem> getLocations() {
return this.locations;
}
public String getLocationsJson() {
return this.locationsJson;
}
public int getZoomLevel() {
return this.zoomLevel;
}
public String getKey() {
return this.key;
}
}
and the test class is :
@ExtendWith({AemContextExtension.class, MockitoExtension.class})
class LocationsModelTest {
Private final AemContext ctx = new AemContext();
public LocationsModel locationsModel;
@BeforeEach
void setUp() throws Exception {
ctx.addModelsForClasses(LocationsModel.class);
ctx.load().json("/locations/LocationsModelTest.json","/content");
}
@Test
void getZoomLevel() {
ctx.currentResource("/content/location");
System.out.println("ctx "+ctx.request().adaptTo(LocationsModel.class));
locationsModel=ctx.request().adaptTo(LocationsModel.class); // GETTING NULL VALUE HERE
int expected = 10;
int actual = locationsModel.getZoomLevel();
locationsModel.getLocations();
assertEquals(expected,actual);
}
}
I am not able to find out why this line is giving null value ..
the paths are correct and I have provided the JSON also in the same path as mentioned but somehow getting null in " locationsModel=ctx.request().adaptTo(LocationsModel.class);"
please help me resolve the issue
Thank you
Solved! Go to Solution.
Views
Replies
Total Likes
you have to mock the service and after that you have to register the service
ex:-
@Mock
MyAccountService myAccountService;
@BeforeEach
public void setUp() throws Exception {
ctx.registerService(MyAccountService.class, myAccountService);
ctx.addModelsForClasses(test.class);
testModel=ctx.request().adaptTo(test.class);
follow this document.
https://wcm.io/testing/aem-mock/usage.html
try adapting the ctx.currentResource() instead of request. That should solve it if I am not wrong.
I tried doing it by ctx.currentResource() but still getting null value
eg :
locationsModel=ctx.currentResource().adaptTo(LocationsModel.class);
you have to mock
GoogleMapAPIConfiguration
how can I do that
could you please tell me please
you have to mock the service and after that you have to register the service
ex:-
@Mock
MyAccountService myAccountService;
@BeforeEach
public void setUp() throws Exception {
ctx.registerService(MyAccountService.class, myAccountService);
ctx.addModelsForClasses(test.class);
testModel=ctx.request().adaptTo(test.class);
follow this document.
https://wcm.io/testing/aem-mock/usage.html
@ChildResourceFromRequest is creating issue here @raushan123 @BattiniSravan
is there any alternative for it?
if I remove the annotation then this line works fine
locationsModel=ctx.request().adaptTo(LocationsModel.class);