Hippo and unit testing

452 views
Skip to first unread message

satija...@gmail.com

unread,
Jul 4, 2017, 6:36:03 AM7/4/17
to Hippo Community
Hi,

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.
i went through below links :



These are implemented with mockito and easy mock with the same example test case on  getContentBean method
and i get no particular result, if i want to use internal methods of hippo test suite ( i downloaded the project from https://code.onehippo.org/cms-community/hippo-testsuite) to test HST components.

I have a little different scenario :

here is my component class :

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

Error :

File : org.onehippo.cms7.essentials.components.CommonComponent

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

Tobias Jeger

unread,
Jul 4, 2017, 6:57:52 AM7/4/17
to hippo-c...@googlegroups.com
If you want your unit test to test nothing else but your java class (i.e. don't pull in more logic, up to a fully bootstrapped repository),
you may need to resort to using PowerMock to be able to mock static methods (such as HstServices#getComponentManager).

Here is an example of how to use PowerMock.

cheers

Tobi

--
Hippo Community Group: The place for all discussions and announcements about Hippo CMS (and HST, repository etc. etc.)
 
To post to this group, send email to hippo-community@googlegroups.com
RSS: https://groups.google.com/group/hippo-community/feed/rss_v2_0_msgs.xml?num=50
---
You received this message because you are subscribed to the Google Groups "Hippo Community" group.
To unsubscribe from this group and stop receiving emails from it, send an email to hippo-community+unsubscribe@googlegroups.com.
Visit this group at https://groups.google.com/group/hippo-community.
For more options, visit https://groups.google.com/d/optout.



--
Amsterdam - Oosteinde 11, 1017 WT Amsterdam
Boston - 101 Main Street, Cambridge, MA 02142

US +1 877 414 4776 (toll free)
Europe +31(0)20 522 4466
www.onehippo.com

neha malhotra

unread,
Jul 25, 2017, 11:06:34 PM7/25/17
to Hippo Community
Hi,

I tried with easymock and it works when we try to just hippobean from request and see this bean is put as an attribute in request.

package org.example.components;

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.hippoecm.hst.core.container.HstContainerURL;
import org.hippoecm.hst.core.container.HstContainerURLImpl;
import org.hippoecm.hst.core.request.HstRequestContext;
import org.junit.Before;
import org.junit.Test;
import org.hippoecm.hst.mock.content.beans.standard.MockHippoBean;
import org.hippoecm.hst.mock.core.component.MockHstRequest;
import org.hippoecm.hst.mock.core.component.MockHstResponse;

import static org.easymock.classextension.EasyMock.*;
import static org.junit.Assert.*;
import org.example.components.SimpleComponent;
import org.hippoecm.hst.container.ModifiableRequestContextProvider;
import org.hippoecm.hst.mock.core.request.MockHstRequestContext;
/**
 * Test for {@link com.jeroenreijn.site.components.AbstractBaseHstComponent}
 */
public class SimpleComponentTest {

    MockHstRequest fakeRequest;
    MockHstResponse fakeResponse;
    SimpleComponent component;

    @SuppressWarnings({ "deprecation", "null" })

    @Before
    public void setUp() throws Exception {
        fakeRequest = new MockHstRequest();
        fakeResponse = new MockHstResponse();
        MockHstRequestContext requestContext = new MockHstRequestContext();
        MockHippoBean mockedBean = new MockHippoBean();
        HstContainerURLImpl baseURL = new HstContainerURLImpl();
        baseURL.setContextPath("/site");
        baseURL.setPathInfo("/hello");
        baseURL.setRequestPath("/hello");
        baseURL.setHostName("localhost:7080");
        baseURL.setPortNumber(7080);
        ModifiableRequestContextProvider.set(requestContext);
       
        requestContext.setBaseURL(baseURL);
        // Retrieve the document based on the URL
        requestContext.setContentBean(mockedBean);
  
       
        component = createMockBuilder(SimpleComponent.class).
                addMockedMethod("getContentBean", HstRequest.class). createMock();

    }

    @Test
    public void testDocumentOnRequestAfterDoBeforeRender() throws Exception {

        HippoBean bean = new HippoDocument();

        //record the expected behavior
        expect(component.getContentBean(fakeRequest)).andReturn(bean);


        //stop recording and switch the mocked Object to replay state.
        replay(component);

        component.doBeforeRender(fakeRequest,fakeResponse);


        //verify the specified behavior has been used
        verify(component);

        assertSame(fakeRequest.getAttribute("document"),bean);
    }
}

Now, If I try to fetch the bean that is created using current request URI (accessing page), it still give null pointer. Have created Mockrequest and Mockbean as well. Any pointers here will help.

neha malhotra

unread,
Jul 25, 2017, 11:12:23 PM7/25/17
to Hippo Community

In Simplecomponent class, if we have

HippoBean bean = getContentBean(request);
        if(bean!=null) {
            request.setAttribute("document",bean);
        }
 
this works.

But when I put

CustomBean document = (CustomBean ) ctx.getContentBean();

it gives NPE.



On Tuesday, July 4, 2017 at 4:06:03 PM UTC+5:30, Suman Satija wrote:

Jasper Floor

unread,
Jul 26, 2017, 11:26:53 AM7/26/17
to Hippo Community
What is ctx? Where do you get that from? you need to create a request context. There is a MockHstRequestContext, which you can use, but you need some component to be able to get it. This you can do with ModifiableRequestContextProvider.set().

mvg,
Jasper

Reply all
Reply to author
Forward
0 new messages