Currently working on junit test cases, I am looking for hippo test suite or testing framework for hippo, mainly to test HST components for now.
These are implemented with mockito and easy mock with the same example test case on getContentBean method
package org.example.components;
import org.example.components.info.DocumentIncludeInfo;
import org.hippoecm.hst.content.beans.standard.HippoDocument;
import org.hippoecm.hst.core.component.HstComponentException;
import org.hippoecm.hst.core.component.HstRequest;
import org.hippoecm.hst.core.component.HstResponse;
import org.hippoecm.hst.core.parameters.ParametersInfo;
import org.onehippo.cms7.essentials.components.CommonComponent;
import org.onehippo.cms7.essentials.components.info.EssentialsDocumentComponentInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ParametersInfo(type = DocumentIncludeInfo .class)
public class HeaderComponent extends CommonComponent {
public static final Logger log = LoggerFactory.getLogger(HeaderComponent.class);
public void doBeforeRender(final HstRequest request, final HstResponse response) throws HstComponentException {
super.doBeforeRender(request, response);
final DocumentIncludeInfo paramInfo = getComponentParametersInfo(request);
final HippoDocument document = getDocumentItem(paramInfo);
request.setAttribute("document", document);
}
public HippoDocument getDocumentItem(final DocumentIncludeInfo componentInfo) {
return getHippoBeanForPath(componentInfo.getDocPath(), HippoDocument.class);
}
}
(where commoncomponent extends existing basehstcomponent class of hippo )
here is my test class for this component with easy mock :
package org.example.junit;
import org.hippoecm.hst.component.support.bean.BaseHstComponent;
import org.hippoecm.hst.content.beans.standard.HippoBean;
import org.hippoecm.hst.content.beans.standard.HippoDocument;
import org.hippoecm.hst.core.component.HstRequest;
import org.junit.Before;
import org.junit.Test;
import org.hippoecm.hst.mock.core.component.MockHstRequest;
import org.hippoecm.hst.mock.core.component.MockHstResponse;
import org.hippoecm.hst.site.HstServices;
import static org.easymock.classextension.EasyMock.*;
import static org.junit.Assert.*;
import org.example.components.HeaderComponent;
/**
* Test for {@link com.jeroenreijn.site.components.AbstractBaseHstComponent}
* @param <AbstractBaseHstComponent>
*/
public class ComponentTest<AbstractBaseHstComponent> {
MockHstRequest fakeRequest;
MockHstResponse fakeResponse;
BaseHstComponent component;
HeaderComponent component1;
HstServices component2;
@Before
public void setUp() throws Exception {
fakeRequest = new MockHstRequest();
fakeResponse = new MockHstResponse();
component2 = createMockBuilder(HstServices.class).addMockedMethod("getComponentManager").createMock();
component = createMockBuilder(BaseHstComponent.class).
addMockedMethod("getComponentParametersInfo", HstRequest.class).
createMock();
component1= new HeaderComponent();
}
@Test
public void testDocumentOnRequestAfterDoBeforeRender() throws Exception {
HippoBean bean = new HippoDocument();
//record the expected behavior
expect(component.getComponentParametersInfo(fakeRequest)).andReturn(bean);
//stop recording and switch the mocked Object to replay state.
//replay(component);
component1.doBeforeRender(fakeRequest,fakeResponse);
//verify the specified behavior has been used
//verify(component);
assertSame(fakeRequest.getAttribute("document"),bean);
}
}
here is my test class with mockito ;
package org.example.junit;
import org.hippoecm.hst.component.support.bean.BaseHstComponent;
import org.hippoecm.hst.content.beans.standard.HippoDocument;
import org.hippoecm.hst.core.component.HstRequest;
import org.hippoecm.hst.core.component.HstResponse;
import org.hippoecm.hst.core.container.ComponentManager;
import org.hippoecm.hst.site.HstServices;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;
import org.onehippo.cms7.essentials.components.CommonComponent;
import static org.mockito.Mockito.*;
import org.example.components.HeaderComponent;
import org.example.components.info.DocumentIncludeInfo;
/**
* Test for {@link com.jeroenreijn.site.components.AbstractBaseHstComponent}
*/
@RunWith(MockitoJUnitRunner.class)
public class AbstractBaseHstComponentTest {
@Mock public HstRequest request;
@Mock public DocumentIncludeInfo info;
@Mock public HstResponse response;
@Mock public CommonComponent component ;
@Spy HeaderComponent component1= null;
@Before
public void setUP(){
component1 = new HeaderComponent();
// HstServices.setComponentManager(compManager) ;
}
@Test
public void testDocumentOnRequestAfterDoBeforeRender() throws Exception {
//stub
doReturn("/content/documents/myhippoproject/headernew").when(info).getDocPath();
//test
component1.doBeforeRender(request, response);
//verify
//verify(request).setAttribute(anyString(), any(HippoDocument.class));
}
}
In both easymock and mockito test cases, I am getting nullpointer exception when i create object for headercomponent class
line no. 93 : doBeforeRenderExtension = HstServices.getComponentManager().getComponent(DoBeforeRenderExtension.class.getName());
where getComponentManager() returns null.
Therefore i tried to create objects of basehstcomponent class ( as headercomponent class extends commoncomponent class and commoncomponent class extends basehstcomponent) , and hstservice class so that something can help with mocking componentmanager.
But nothing helped. here below are the errors :
java.lang.NullPointerException
at org.onehippo.cms7.essentials.components.CommonComponent.<init>(CommonComponent.java:93)
at org.example.components.HeaderComponent.<init>(HeaderComponent.java:17)
at org.example.junit.ComponentTest.setUp(ComponentTest.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Please help !!
Regards
Suman