2016-06-05 6 views
0

Я обновил версию MRUnit до версии 1.1.0 в своем проекте, чтобы использовать RedDriver для тестирования нескольких выходов. После внесения изменений в мой тест (чтобы заставить его работать с обновлением), я получаю эту ошибку:java.lang.VerifyError: Ожидание кадра stackmap в ветке при использовании PowerMockRunner

java.lang.VerifyError: Expecting a stackmap frame at branch target 63 
Exception Details: 
Location: (path to test class) 
Reason: Expected stackmap frame at this location. 
Bytecode: (Bytecode) 

Мой тест выглядит следующим образом (намеренно удалили код, чтобы сделать это более кратким):

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MultipleOutputs.class) 
public class myReducerTest { 
    private ReduceDriver<Text, Text, Text, Text> reduceDriver; 

    @Before 
    public void setUp() { 
     reduceDriver = ReduceDriver.newReduceDriver(new myReducer()); 
    } 

    @Test 
    public void testHappyPath() throws IOException { 
     /* 
      Code to declare input key, inout value, expected output, etc. 
     */ 

     reduceDriver.withInput(myInputKey, myInputVal); 
     reduceDriver.withMultiOutput("reportName1", key, expectedValue1); 
     reduceDriver.withMultiOutput("reportName2", key, expectedValue2); 
     reduceDriver.runTest(); 
    } 
} 

Я получаю сообщение об ошибке, когда использую @PrepareForTest. Обратите внимание: класс myReducer не имеет статических или конечных методов. Поэтому он не включен в аннотацию @PrepareForTest. Часть моего файла п (я использую Maven для строительства) выглядит следующим образом:

<dependency> 
     <groupId>org.mockito</groupId> 
     <artifactId>mockito-all</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-api-mockito</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-core</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-api-easymock</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-module-junit4</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.mrunit</groupId> 
     <artifactId>mrunit</artifactId> 
     <version>1.1.0</version> 
     <classifier>hadoop2</classifier> 
     <scope>test</scope> 
    </dependency> 

Также обратите внимание, что я использую Java 8, и не могу понизить до v7 или v6, как указано здесь: java.lang.VerifyError: Expecting a stackmap frame at branch target

I также попытался добавить плагин surefire в файл pom, как упоминалось здесь: java.lang.VerifyError: Expecting a stackmap frame at branch target 73

Ни одно из этих решений не работает в этом случае.

+0

Если вы считаете, что кто-то предложил добавить плагин surefire к вашему pom-файлу, вы должны работать над своими навыками чтения. В самом деле. (И с «чтением» я имею в виду «чтение и понимание»). Я мог бы попытаться объяснить дальше, но если вы прочтете мое объяснение так же, как вы прочтете связанный ответ, это не поможет. – Holger

+0

@Holger Я новичок в Java. Maven собирает все из файла POM при построении, поэтому я сделал предположение. Проверьте эту ссылку http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html Информация о плагинах находится в Project/Build – Sarin

+0

Это не имеет ничего общего с Java. Это только чтение текста и понимание того, что он говорит. Никто не сказал, что вы должны установить этот плагин. Попытайтесь понять предыдущее предложение. – Holger

ответ

-1

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

0

У меня была аналогичная проблема и нашел эту ссылку: https://github.com/jayway/powermock/issues/375.

MRunit 1.1.0 использует PowerMock 1.5.1. который использует JavaAssist 3.18.0-GA.
JavaAssist 3.18.2-GA содержит исправление для проверкиError.

Исключить старую зависимость PowerMock в MRUnit и заменить ее PowerMock 1.5.5 или новее. Эти версии PowerMock содержат исправленную версию JavaAssist.

<dependency> (all PowerMock dependencies) 
     ... PowerMock dependency ... 
     <version>1.5.5(or higher)</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.mrunit</groupId> 
     <artifactId>mrunit</artifactId> 
     <version>1.1.0</version> 
     <exclusions> 
      ...insert all PowerMock exclusions... 
     </exclusions> 
     <classifier>hadoop2</classifier> 
     <scope>test</scope> 
    </dependency>