Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.

Junit for getting Configuration through Bundle Context

Avatar

Level 2

I am trying to write Junit using Junit5

 

@Mock
ProcessingComponentConfiguration config;

@Mock
FrameworkUtil framework;

@BeforeEach
void setup() {
MockitoAnnotations.initMocks(this);
}

@Mock
ConfigurationAdmin configAdmin;

@Mock
ProcessingContext context;

@Mock
BundleContext bundleContext;

@Mock
SlingHttpServletRequest request;

@test
void testInit() throws IOException {
Mockito.when(context.getRequest()).thenReturn(request);
Mockito.when( request.getServerName()).thenReturn("server");
Mockito.when(framework.getBundle(Test.class).getBundleContext()).thenReturn(bundleContext);

}

 

It is giving null pointer exception when I inspect framework.getBundle(Test.class).getBundleContext().

 

How to write Junit for this. Below is my code.

 

BundleContext bundleContext = FrameworkUtil.getBundle(Test.class).getBundleContext();
ServiceReference slingSettingRef = bundleContext.getServiceReference(SlingSettingsService.class.getName());
SlingSettingsService slingSetting = (SlingSettingsService) bundleContext.getService(slingSettingRef);
ServiceReference factoryRef = bundleContext.getServiceReference(ConfigurationAdmin.class.getName());
ConfigurationAdmin configAdmin = (ConfigurationAdmin) bundleContext.getService(factoryRef);

4 Replies

Avatar

Employee Advisor

I recommend you to use the AEM Mocks library; it provides you mock implementations for the OSGI basics and there you can create tests much more easily and convenient.

 

I wrote some blog posts about it, you can find them here: https://cqdump.joerghoh.de/tag/unittest/

Avatar

Level 2

Hi @Jörg_Hoh 
If we don't want to change the original codebase is there still any way to mock Bundle Context?

 

Avatar

Employee Advisor

of course you can do that, but I think the benefit is large, especially because you don't need to rewrite all tests at once. But you can start with using the Sling Mocks / AEM Mocks when you need to create tests.

To your case: You probably need to mock each single step:

@Mock
Bundle myBundle;

@test
void testInit() throws IOException {
Mockito.when(context.getRequest()).thenReturn(request);
Mockito.when( request.getServerName()).thenReturn("server");
Mockito.when(framework.getBundle(eq(Test.class).thenReturn(myBundle);
Mockito.when(myBundle.getBundleContext()).thenReturn(bundleContext);