草庐IT

java - arraylength 中操作数堆栈上的错误类型

coder 2023-08-28 原文

我正在尝试使用 powermock 测试一种方法。我还没有写任何测试用例。只是想为 Mocking 设置类(class)。这是我到目前为止所拥有的:

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

cmd 上的 java -version 给我 1.7.0_65

java_home 设置为 C:\Program Files\Java\jdk1.7.0_65

在 eclipse 上我使用的是 jre 7,编译器级别是 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 中,这个特定的空气测试也失败了。 Link to the solution

最佳答案

因此,经过几个小时的努力,我找到了问题的根本原因。 在 Java 7u65 中,他们使字节码 validator 更加严格,字节码 validator 读取 PowerMock 字节码并抛出 VerifyError。 所以,基本上,PowerMock 的字节码没有通过字节码 validator 。唯一的解决方法是添加 -XX:-UseSplitVerifier 作为 VM 参数或切换到 Java 6。

在我的例子中,当我删除 ruleRecord[1].split(",") 并实现我自己的拆分功能时,测试工作正常。我猜 Powermock 在我们使用时弄乱了字节码,例如 whenNew() 这样的方法。 希望这会有所帮助。

关于java - arraylength 中操作数堆栈上的错误类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25371284/

有关java - arraylength 中操作数堆栈上的错误类型的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  3. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  6. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  7. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  8. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  9. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  10. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

随机推荐