Expand my Community achievements bar.

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);