Amos的随笔

Java/Python/Go,软件测试等等

导航

Idea执行assert false未生效问题处理

问题背景

在某个方法里添加了assert false来主动抛出异常,但是很奇怪的时,执行到这段代码却没有堆栈抛出。

测试assert false

package com.amos.learn.util;

import org.junit.Test;

public class AssertTest {

    @Test
    public void testAssert() {
        assert false;
        System.out.println("junit");

    }

    public static void main(String[] args) {
        assert false;
        System.out.println("main");
    }
}

执行testAssert方法

java.lang.AssertionError
at com.amos.learn.util.AssertTest.testAssert(AssertTest.java:9)

执行main方法

junit
Process finished with exit code 0

奇怪的是,assert false;在main方法里竟然没有生效。

解决问题

非常感谢《XiufengWu - java使用assert断言时不起作用的解决办法

对比两次java执行命令

在idea内点击run的时候,Run面板可以看到各自的java执行命令

junit

“C:\Program Files\Java\jdk1.8.0_171\bin\java.exe” -ea -Didea.test.cyclic.buffer.size=1048576 “此处省略编码/代理/jar包等等” com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.amos.learn.util.AssertTest,testAssert

main

“C:\Program Files\Java\jdk1.8.0_171\bin\java.exe” -Didea.test.cyclic.buffer.size=1048576 “此处省略编码/代理/jar包等等” com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.amos.learn.util.AssertTest

两次执行,junit有加入-ea选项,这个是什么呢 ?往下看:

打开cmd面板,输入java -help

可以看到有这么一段命令解释:

-ea[:<packagename>…|:<classname>]
-enableassertions[:<packagename>…|:<classname>]
按指定的粒度启用断言
-da[:<packagename>…|:<classname>]
-disableassertions[:<packagename>…|:<classname>]
禁用具有指定粒度的断言
-esa | -enablesystemassertions
启用系统断言
-dsa | -disablesystemassertions
禁用系统断言

jvm在执行class文件的时候,默认是没有启动指定粒度/系统断言的。所以如果想在非@Test方法(或着其他断言方法内)启动断言,得在jvm命令里添加上-ea

IDEA解决方式

既然知道问题的根源,那么我们只需要跟着步骤走即可。

打开IDEA,主菜单RUN -> Edit configurations -> VM options:添加-ea,问题搞定。

本章完。

posted on 2019-01-25 11:26  AmosChen  阅读(106)  评论(0)    收藏  举报  来源