Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.lang.VerifyError in while running a JUNIT mockito and powermock for maven project

This is the exception when I am running clean cobertura:cobertura. I tried running this as JUNIT from eclipse but still no luck.
I am using the following dependencies for My project.

  • org.mockito mockito-all 1.10.19
  • org.mockito mockito-core 1.10.19
  • junit junit 4.11
  • junit-addons junit-addons 1.4
  • org.powermock powermock-module-junit4 1.6.2
  • org.powermock powermock-api-mockito 1.6.2

POM file changes:

<cobertura-maven-plugin.version>2.6</cobertura-maven-plugin.version>
<maven-surefire-plugin.version>2.12.2</maven-surefire-plugin.version>
            <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>cobertura-maven-plugin</artifactId>
                    <version>${cobertura-maven-plugin.version}</version>
                    <configuration>
                        <formats>
                            <!-- Comment out any output formats you dont need (will put in a profile later) -->
                            <format>html</format>       
                            <!-- <format>xml</format>-->
                        </formats>
                        <outputDirectory>${project.build.directory}/coverage-reports</outputDirectory>      
                        <!-- <instrumentation>
                            <ignoreTrivial>true</ignoreTrivial>         
                            <ignores>
                                <ignore>org.slf4j.Logger.*</ignore>     
                            </ignores>
                            <excludes>
                                <exclude>**/Example.class</exclude>     
                            </excludes>
                        </instrumentation> -->
                    </configuration>
                    <executions>
                        <!-- <execution>
                            <id>clean-coverage-report</id>
                            <phase>clean</phase>            
                            <goals>
                                <goal>clean</goal>
                            </goals>
                        </execution> -->
                        <execution>
                            <id>create-coverage-report</id>
                            <phase>package</phase>          
                            <goals>
                                <goal>cobertura</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>${maven-surefire-plugin.version}</version>
                    <configuration>
                        <skipTests>false</skipTests>
                        <testFailureIgnore>true</testFailureIgnore>
                        <forkMode>once</forkMode>
                        <argLine>-Xms512m -Xmx1024m -XX:MaxPermSize=512m</argLine>
                    </configuration>
                </plugin>
                <!-- test dependencies -->
            <!-- Mocking & Testing Code -->
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-all</artifactId>
                <version>1.10.19</version>
            </dependency>
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-core</artifactId>
                <version>1.10.19</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>junit-addons</groupId>
                <artifactId>junit-addons</artifactId>
                <version>1.4</version>
            </dependency>   
            <dependency>
                <groupId>org.powermock</groupId>
                <artifactId>powermock-module-junit4</artifactId>
                <version>1.6.2</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.powermock</groupId>
                <artifactId>powermock-api-mockito</artifactId>
                <version>1.6.2</version>
                <scope>test</scope>
            </dependency>

Exception:

java.lang.VerifyError: (class: com/day/cq/search/Predicate, method: <init> signature: (Ljava/lang/String;Ljava/lang/String;)V) Constructor must call super() or this()
            at java.lang.Class.getDeclaredConstructors0(Native Method)
            at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
            at java.lang.Class.getDeclaredConstructors(Unknown Source)
            at org.powermock.api.mockito.repackaged.ClassImposterizer.setConstructorsAccessible(ClassImposterizer.java:85)
            at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:71)
            at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:49)
            at org.powermock.api.mockito.repackaged.CglibMockMaker.createMock(CglibMockMaker.java:24)
            at org.powermock.api.mockito.internal.mockmaker.PowerMockMaker.createMock(PowerMockMaker.java:45)
            at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33)
            at org.mockito.internal.MockitoCore.mock(MockitoCore.java:59)
            at org.mockito.Mockito.mock(Mockito.java:1285)
            at org.mockito.Mockito.mock(Mockito.java:1163)
            at com.ftc.digital.services.search.impl.SearchServiceImplTest.setUp(SearchServiceImplTest.java:62)
            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.internal.runners.MethodRoadie.runBefores(MethodRoadie.java:132)
            at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:95)
            at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
            at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)
            at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
            at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
            at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86)
            at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
            at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
            at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
            at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
            at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33)
            at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45)
            at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:122)
            at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:106)
            at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
            at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
            at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
            at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
            at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
            at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
            at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
            at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Update: Search Class code:

@Service(SearchService.class)
@Component(label = "Search Service", metatype = true, immediate = true)
public class SearchServiceImpl implements SearchService
{
    private final Logger logger = LoggerFactory.getLogger(getClass());
    @Override
    public final SearchResult getResult(final SlingHttpServletRequest slingRequest, final Map<String,
         String> predicateParameterMap, final String searchRootPath, final int startPage, final int resultsPerPage)
    {
        // Add additional predicates
        logger.info("resultsPerPage" + resultsPerPage);
        predicateParameterMap.put("path", searchRootPath);
        predicateParameterMap.put("p.offset", Long.toString(calculateOffset(startPage, resultsPerPage)));
        predicateParameterMap.put("p.limit", Integer.toString(resultsPerPage));
        predicateParameterMap.put("orderby", "@jcr:score");
        predicateParameterMap.put("orderby.sort", "desc");

        // Create query and get result
        final com.day.cq.search.result.SearchResult result = createQuery(slingRequest.getResourceResolver(),
                predicateParameterMap).getResult();

        // Populate search result
        final SearchResult searchResult = new SearchResult();
        searchResult.setCurrentPage(calculateCurrentPage(result.getStartIndex(), result.getHitsPerPage()));
        searchResult.setTotalPages(calculateTotalPages(result.getTotalMatches(), result.getHitsPerPage()));
        searchResult.setTotalResults(result.getTotalMatches());
        searchResult.setResultsPerPage((int) result.getHitsPerPage());
        searchResult.setResults(result.getHits());
        return searchResult;
    }

    @Override
    public final long calculateOffset(final int startPage, final int resultsPerPage)
    {
        if (startPage <= 1)
        {
            return 0;
        }

        return ((startPage * resultsPerPage) - resultsPerPage);
    }

    /**
     * Calculates the current page number.
     * 
     * @param startIndex The start index of the search results.
     * @param hitsPerPage The results to show per page.
     * @return The calculated current page number.
     */
    private int calculateCurrentPage(final long startIndex, final long hitsPerPage)
    {
        if (startIndex == 0L)
        {
            return 1;
        }

        return (int) Math.ceil((double) (startIndex + 1) / hitsPerPage);
    }

    /**
     * Calculates the total pages for the search results.
     * 
     * @param totalMatches The total search results.
     * @param hitsPerPage The results to show per page.
     * @return The calculated total number of pages.
     */
    private int calculateTotalPages(final long totalMatches, final long hitsPerPage)
    {
        if (totalMatches == 0)
        {
            return 0;
        }

        final int totalPages = (int) (Math.ceil((double) totalMatches / hitsPerPage));
        return totalPages;
    }

    /**
     * Create the search query either using predicateMap.
     * 
     * @param resourceResolver The resource resolver.
     * @param predicateParamMap The parameters to use for the query.
     * @return The search query.
     */
    private Query createQuery(final ResourceResolver resourceResolver, final Map<String, String> predicateParamMap)
    {
        final QueryBuilder queryBuilder = resourceResolver.adaptTo(QueryBuilder.class);
        final Session session = (Session) resourceResolver.adaptTo(Session.class);

        Query query = null;
        query = queryBuilder.createQuery(PredicateGroup.create(predicateParamMap), session);
        return query;
    }

}

Test Class for the above source class:

public class SearchServiceImplTest
{

    private SearchServiceImpl searchService;
    private SearchResult result;
    private HashMap<String, String> predicateParameterMap;
    private ResourceResolver resourceResolver;
    private QueryBuilder queryBuilder;
    private Session session;
    private Query query;
    private PredicateGroup predicateGroup;
    private java.util.List<Hit> hits;
    private SlingHttpServletRequest request = null;
    private com.project.digital.models.SearchResult searchResult;
    private static long TEST_START_INDEX = 0;
    private static long TEST_HITS_PER_PAGE = 2;
    private static long TEST_TOTAL_MATCHES = 5;

    private static String TEST_SEARCH_ROOT_PATH = "/content/testSite/en";

    @SuppressWarnings("unchecked")
    @Before
    public void setUp() throws Exception
    {
        searchService= spy(new SearchServiceImpl());
        predicateParameterMap = mock(HashMap.class);
        result = mock(SearchResult.class);
        request = mock(SlingHttpServletRequest.class);
        resourceResolver = mock(ResourceResolver.class);
        queryBuilder = mock(QueryBuilder.class);
        session = mock(Session.class);
        query = mock(Query.class);
        predicateGroup = mock(PredicateGroup.class);
        hits = (java.util.List<Hit>) mock(List.class);

        searchResult = new com.project.digital.models.SearchResult();

        Mockito.when(new com.project.digital.models.SearchResult()).thenReturn(searchResult);
        when(request.getResourceResolver()).thenReturn(resourceResolver);
        when(resourceResolver.adaptTo(QueryBuilder.class)).thenReturn(queryBuilder);
        when(resourceResolver.adaptTo(Session.class)).thenReturn(session);
        when(PredicateGroup.create(predicateParameterMap)).thenReturn(predicateGroup);
        when(queryBuilder.createQuery(predicateGroup, session)).thenReturn(query);
        when(query.getResult()).thenReturn(result);
    }


    private void mockSearchResult(long startIndex, long hitsPerPage, long totalMatches, List<Hit> hits)
    {
        when(result.getStartIndex()).thenReturn(startIndex);
        when(result.getHitsPerPage()).thenReturn(hitsPerPage);
        when(result.getTotalMatches()).thenReturn(totalMatches);
        when(result.getHits()).thenReturn(hits);

    }
}

When I am using the PredicateGroup in my test class than I am getting this exception.

like image 327
amitdeol Avatar asked Dec 27 '25 23:12

amitdeol


1 Answers

Add -noverify as a JVM argument.

We hit the same issue, a VerifyError coming from java.lang.Class.getDeclaredConstructors0() with the Powermock ClassImposterizer class farther up in the stacktrace.

Our dependencies are almost identical to yours as well - we use jUnit 4.12 instead of 4.11 but the same versions of PowerMock (1.6.2) and Mockito (1.10.19).

Since we use Jenkins to launch Ant scripts not Maven, I added this parameter to the junit Ant task - you will have to modify as appropriate for Maven:

<jvmarg line="-noverify"/>

Of course, we did not want "-noverify" to apply to ALL our tests, so I extracted the one that was hitting the VerifyError exception from the main suite and ran it separately. Your context may be different.

like image 174
sjgp Avatar answered Dec 30 '25 13:12

sjgp



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!