Лош тип в стека на операндите в arraylength

Опитвам се да тествам метод с помощта на powermock. все още не съм написал никакви тестови случаи. Просто се опитвам да настроя класа за подигравка. ето какво имам досега:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ ReadRubric.class })
public class ReadRubricTest {
    @Before
    public void setUp() throws Exception {
        PowerMockito.mock(ReadRubric.class);
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void invalidFile() throws Exception {
    }
}

Когато се опитам да стартирам този тест, получавам следната грешка.

java.lang.VerifyError: Bad type on operand stack in arraylength
    Exception Details:
      Location:
        com/cerner/devcenter/wag/processor/ReadRubric.readRubric()Ljava/util/List; @809: arraylength
      Reason:
        Invalid type: 'java/lang/Object' (current frame, stack[0])
      Current Frame:
        bci: @809
        flags: { }
        locals: { 'java/util/ArrayList', 'au/com/bytecode/opencsv/CSVReader', top, top, '[Ljava/lang/String;', 'com/cerner/devcenter/wag/processor/Rule', 'java/lang/Object', 'java/lang/Object', top, top, top, top, top, top, top, 'java/lang/Object' }
        stack: { 'java/lang/Object' }

java -version on cmd gives me 1.7.0_65

java_home is set to C:\Program Files\Java\jdk1.7.0_65

On eclipse I am using jre 7 and the compiler level is 1.7

В моя maven добавих следната зависимост, за да разреша случаи на превключване, които приемат низове вместо знаци:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
         </plugin>

може ли някой да ми помогне в разрешаването на този проблем?

Ето метода, който тествам:

public static List<Rule> readRubric() throws WAGException, IOException {
        List<Rule> ruleList = new ArrayList<Rule>();
        CSVReader rubricReader = null;
            File file = new File(RUBRIC_FILE_NAME);
            FileReader fileReader = new FileReader(file);
            rubricReader = new CSVReader(fileReader);
            String[] ruleRecord = null;
            //rubricReader.readNext();
            while ((ruleRecord = rubricReader.readNext()) != null) {
                Rule rule = new Rule();
                rule.setRuleName(ruleRecord[0].trim());
                String parameters[] = ruleRecord[1].split(",");
                rule.addParameter(Arrays.asList(parameters));
                rule.setPoints(Integer.parseInt(ruleRecord[2].trim()));
                rule.setRuleEngine(ruleRecord[3].trim());
            rule.setComment(ruleRecord[4].trim());
                    ruleList.add(rule);
        }
            rubricReader.close();
        return ruleList;
    }

Намерих решението онлайн: казва, че трябва да добавя -XX:-UseSplitVerifier към моите VM аргументи, когато стартирам теста. Тестът се изпълнява, когато направя това. Но имам нужда от него, за да работи с maven, за това решението казва, че трябва да добавя следния плъгин към maven:

<plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.14.1</version>
            <configuration>
                <argLine>-XX:-UseSplitVerifier</argLine>
            </configuration>
        </plugin>
    </plugins>

Но дори след като добавих това към моя POM, този конкретен тест се проваля. Връзка към решението


person Nemin    schedule 18.08.2014    source източник
comment
Ще публикувате ли, моля, класа ReadRubric?   -  person Brian Dishaw    schedule 19.08.2014
comment
@BrianDishaw: добавих класа ReadRubric във въпроса.   -  person Nemin    schedule 19.08.2014


Отговори (1)


И така, след като работих върху него с часове, открих основната причина за проблема. В Java 7u65 те направиха верификатора на байт код по-строг в резултат на това, верификаторът на байт код чете байт код на PowerMock и хвърля VerifyError. Така че, основно, байт кодът на PowerMock не преминава верификатора на байт кода. Единственият начин е да добавите -XX:-UseSplitVerifier като VM аргументи или да преминете към Java 6.

В моя случай, когато премахна ruleRecord[1].split(",") и когато внедря собствената си разделена функционалност, тестовете работят добре. Предполагам, че Powermock обърква байт кода, когато използваме, например, методи като whenNew(). Надявам се това да помогне.

person Nemin    schedule 20.08.2014
comment
Много впечатляващо, сър... и това ми помогна много пъти - person jgreen; 12.04.2016