2015-11-15 4 views
3

Это исключение, когда я запускаю clean cobertura:cobertura. Я пытался запустить это как JUNIT из затмения, но все равно не повезло.
Я использую следующие зависимости для моего проекта.java.lang.VerifyError при запуске JUNIT mockito и powermock для проекта maven

  • org.mockito Mockito-все 1.10.19
  • org.mockito Mockito-жильный 1.10.19
  • JUnit JUnit 4.11
  • JUnit-аддоны JUnit-аддонов 1.4
  • org.powermock powermock -модуль-junit4 1.6.2
  • org.powermock powermock-апи-Mockito 1.6.2

изменения ПОМ файла:

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

Исключение:

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) 

Обновление: Поиск кода Класс:

@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; 
    } 

} 

Тест-класс для указанного класса источника:

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

    } 
} 

Когда я использую PredicateGroup в мой тестовый класс, чем я получаю это исключение.

+0

Я изменил powermockito на mockito. теперь я получаю следующую ошибку: 'java.lang.VerifyError: (класс: com/day/cq/search/Predicate, method: подпись: (Ljava/lang/String; Ljava/lang/String;) V) Конструктор необходимо вызвать супер() или этот() \t на java.lang.Class.getDeclaredConstructors0 (Native Method) \t в java.lang.Class.privateGetDeclaredConstructors (Unknown Source) \t на java.lang.Class.getDeclaredConstructors (Неизвестный источник) \t at org.powermock.api.mockito.repackaged.ClassImposterizer.setConstructorsAccessible (ClassImposterizer.java:85) ... ' – amitdeol

+0

Пробовал с Java 8, JUNIT 4.12 и Mockito 1.10.8, но не смог решить проблему. – amitdeol

+0

Чувствуется ошибкой, специфичной для вашего кода или для использования вами com.day.cq.search.Predicate. Не могли бы вы попытаться максимально упростить ваш тест/CUT и опубликовать его здесь? – Eric

ответ

1

Добавить -noverify как аргумент JVM.

Мы сталкиваемся с той же проблемой, VerifyError, исходящей из java.lang.Class.getDeclaredConstructors0() с классом Powermock ClassImposterizer дальше в стеке.

Наши зависимости почти идентичны вашим - мы используем jUnit 4.12 вместо 4.11, но те же версии PowerMock (1.6.2) и Mockito (1.10.19).

Поскольку мы используем Jenkins для запуска Ant скрипты не Maven, я добавил этот параметр в JUnit Ant задачи - вы должны изменить соответствующим образом для Maven:

<jvmarg line="-noverify"/> 

Конечно, мы не хотим " -noverify ", чтобы применить ко всем нашим тестам, поэтому я извлек тот, который ударил исключение VerifyError из основного пакета и запускал его отдельно. Ваш контекст может быть другим.