IDEA Junit4配置

Posted 请叫我大表哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IDEA Junit4配置相关的知识,希望对你有一定的参考价值。

一、安装JUnitGenerator V2.0。

  1、通过网络安装。如下

  2、手动下载插件安装。插件下载:https://plugins.jetbrains.com/idea/plugin/3064-junitgenerator-v2-0 。安装如下图所示:

  3、安装完成重启IDEA,即可使用。

二、修改JUnitGenerator V2.0的配置。

  1、自动生成测试代码和java类在同一包下,不匹配maven项目标准测试目录。

     修改Output Path为:${SOURCEPATH}/../../test/java/${PACKAGE}/${FILENAME},

       Default Template选择JUnit 4。

  2、修改测试用例模板。模板中生成的package的包名需去掉test。

三、生成JUnit4测试用例。

  方法一:在待编写测试的java类源码块上按快捷键Alt + Insert。选择JUnit Test->JUnit 4。

 

  方法二、在待编写测试的java类源码块上按快捷键Ctrl + Shift + T。

 

  根据需要修改相关测试用例

  方法三:光标定位到待编写测试的java类源码块,选择code->Generate,后面的步骤和方法1一样。

  最终生成的用例如下:

四、注意。

  IDEA自带的JUnit插件和JUnitGeneratorV2.0插件都要勾选上,若只勾选JUnit可能导致无法自动生成测试文件,

  若只勾选JUnitGenerator V2.0可能导致生成的测试文件无法运行

 

实体类junit测试用例生成

package com.wms;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Administrator on 2017/4/8.
 */
public class Test {

    private static final StringBuilder sb = new StringBuilder();

    public static void writeClass(String classStr, OutputStreamWriter out) {
        try {
            Class clz = Class.forName(classStr);
//            Method[] methods = clz.getDeclaredMethods();
//            for (Method method : methods) {
//                String methodName = method.getName();
//                Class[] params = method.getParameterTypes();
//                for (Class param : params) {
//                    System.out.println(param.getName());
//                }
//            }
            Field[] fields = clz.getDeclaredFields();

            for (Field field : fields) {
                Class c = field.getType();
//                System.out.println(c.isInterface());
//                System.out.println(c.getName());
//                Class cc = Class.forName(c.getName());
//                Object o = cc.newInstance();
                //只写入set方法即可

                out.write(setMethod(classStr, getParam(c, field.getName()), field.getName()));
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Map<String, Object> getParam(Class clz, String field) {

        Map<String, Object> map = new HashMap<String, Object>();
        boolean isReference = false;
        String result = "";

        String className = clz.getName();
        String clzName = className;
        if (className.contains(".")) {
            clzName = className.substring(className.lastIndexOf(".") + 1);
        }
        clearSb(sb);
        if (clz.isInterface()) {
            result = null;
        } else if (className.startsWith("[L")) {
            clzName = clzName.replaceAll(";", "");
            sb.append(clzName).append("[] o = ").append("new ").append(clzName).append("[]{};");
            result = sb.toString();
            isReference = true;
        } else if (clz == String.class) {
            sb.append("\\"").append(field).append("\\"");
            result = sb.toString();
        } else if (clz == Integer.class || clz == int.class) {
            result = "1";
        } else if (clz == Long.class || clz == long.class) {
            result = "1L";
        } else if (clz == Float.class || clz == float.class) {
            result = "1.1f";
        } else if (clz == Double.class || clz == double.class) {
            result = "1.1";
        } else if (clz == Short.class || clz == short.class) {
            result = "(short)1";
        } else if (clz == Boolean.class || clz == boolean.class) {
            result = "true";
        } else if (clz == char.class || clz == Character.class) {
            result = "\\\'1\\\'";
        } else if (clz == byte.class || clz == Byte.class) {
            result = "(byte)1";
        } else {
            sb.append(clzName).append(" o = ").append("new ").append(clzName).append("();");
            result = sb.toString();
            isReference = true;
        }

        map.put("result", result);
        map.put("isReference", isReference);

        return map;
    }

    public static String setMethod(String classStr, Map<String, Object> map, String field) {
        clearSb(sb);
        classStr = classStr.substring(classStr.lastIndexOf(".") + 1);
        boolean isReference = (Boolean) map.get("isReference");
        String result = (String) map.get("result");
        String str = firstLowerToUpper(field);
        sb.append("\\t");
        sb.append("@Test").append("\\n");
        sb.append("\\t");
        sb.append("public void testSet").append(str).append("()").append("\\n");
        sb.append("\\t");
        sb.append("{").append("\\n");
        sb.append("\\t").append("\\t");
        sb.append(classStr).append(" obj = new ").append(classStr).append("();").append("\\n");
        sb.append("\\t").append("\\t");

        if (isReference) {
            sb.append(result).append("\\n");
            result = "o";
            sb.append("\\t").append("\\t");
        }

        sb.append("obj.set").append(str).append("(").append(result).append(");").append("\\n");
        sb.append("\\t").append("\\t");
        sb.append("assertTrue(").append(result).append(" == obj.get").append(str).append("());")
                .append("\\n");
        sb.append("\\t");
        sb.append("}").append("\\n").append("\\n");
        return sb.toString();
    }

    public static String firstLowerToUpper(String field) {
        return field.substring(0, 1).toUpperCase() + field.substring(1);
    }


    public static void createTestFile(String projectPath, String[] pkgs, boolean rebuild) {
        OutputStreamWriter out = null;
        for (String pkg : pkgs) {

            String testPkgPath = checkTestPackage(projectPath, pkg);
            String srcPkgPath = getJavaPackagePath(projectPath, pkg);

            File file = new File(srcPkgPath);
            for (File file1 : file.listFiles()) {

                String className = getClassName(file1.getName());
                File testFile = new File(getTestFile(testPkgPath, className));
                if (!testFile.exists() || rebuild) {
                    try {
                        //0. 创建测试用例文件
                        testFile.createNewFile();

                        //1. 写入测试用例类的包名
                        out = new FileWriter(testFile);
                        out.write(packageLine(pkg));

                        //2. 写入junit测试用例用到的包
                        out.write(importJunitClassLine());

                        //3. 写入测试用例类名
                        out.write(startClassNameLine(className + "Test"));

                        //4. before,after方法写入
//                        out.write(beforeMethod());
//                        out.write(afterMethod());

                        //5. 写入测试方法
                        writeClass(getClass(pkg, className), out);

                        // 类结束
                        out.write(endClassNameLine());
                        out.flush();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        if (out != null) {
                            try {
                                out.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }

    }

    /**
     * 检查测试类路径下的指定包是否存在,不存在则创建
     *
     * @param projectPath
     * @param pkg
     * @return
     */
    public static String checkTestPackage(String projectPath, String pkg) {
        String dstPath = getTestPackagePath(projectPath, pkg);
        File f = new File(dstPath);
        if (!f.exists()) {
            f.mkdirs();
        }
        return dstPath;
    }

    /**
     * 获取测试类的全路径名
     *
     * @param dstPackage
     * @param className
     * @return
     */
    public static String getTestFile(String dstPackage, String className) {
        clearSb(sb);
        sb.append(dstPackage).append(File.separator).append(className).append("Test.java");
        return sb.toString();
    }

    /**
     * 包声明行
     *
     * @param pkg
     * @return
     */
    public static String packageLine(String pkg) {
        clearSb(sb);
        sb.append("package ").append(pkg).append(";");
        sb.append("\\n").append("\\n");
        return sb.toString();
    }

    /**
     * junit类导入行
     *
     * @return
     */
    public static String importJunitClassLine() {
        clearSb(sb);
        sb.append("import org.junit.Test;").append("\\n");
        sb.append("import org.junit.Before;").append("\\n");
        sb.append("import org.junit.After;").append("\\n").append("\\n").append("\\n");
        sb.append("import static org.junit.Assert.*;").append("\\n").append("\\n");
        return sb.toString();
    }

    /**
     * 类开始
     *
     * @param fileName
     * @return
     */
    public static String startClassNameLine(String className) {
        clearSb(sb);
        sb.append("public class ").append(className).append("\\n");
        sb.append("{").append("\\n");
        return sb.toString();
    }

    /**
     * 类结束
     *
     * @return
     */
    public static String endClassNameLine() {
        return "\\n}";
    }

    /**
     * beforeMethod
     *
     * @return
     */
    public static String beforeMethod() {
        clearSb(sb);
        sb.append("\\n").append("\\t").append("@Before").append("\\n");
        sb.append("\\t").append("public void before()").append("\\n");
        sb.append("\\t").append("{").append("\\n");
        sb.append("\\t").append("}").append("\\n");
        return sb.toString();
    }

    /**
     * afterMethod
     *
     * @return
     */
    public static String afterMethod() {
        clearSb(sb);
        sb.append("\\n").append("\\t").append("@After").append("\\n");
        sb.append("\\t").append("public void after()").append("\\n");
        sb.append("\\t").append("{").append("\\n");
        sb.append("\\t").append("}").append("\\n");
        return sb.toString();
    }

    /**
     * 获取类全名,含有包
     *
     * @param pkg
     * @param className
     * @return
     */
    public static String getClass(String pkg, String className) {
        return pkg + "." + className;
    }

    /**
     * 获取类名,不含包
     *
     * @param fileName
     * @return
     */
    public static String getClassName(String fileName) {
        return fileName.replace(".java", "");
    }

    /**
     * 获取java源文件路径下的指定包
     *
     * @param projectPath
     * @param pkg
     * @return
     */
    public static String getJavaPackagePath(String projectPath, String pkg) {
        String packagePath = pkg.replaceAll("\\\\.", "/");
        return projectPath + "/src/main/java" + File.separator + packagePath;
    }

    /**
     * 获取java测试类路径下的指定包
     *
     * @param projectPath
     * @param pkg
     * @return
     */
    public static String getTestPackagePath(String projectPath, String pkg) {
        String packagePath = pkg.replaceAll("\\\\.", "/");
        return projectPath + "/src/test/java" + File.separator + packagePath;
    }

    /**
     * 清空StringBuilder
     *
     * @param sb
     */
    public static void clearSb(StringBuilder sb) {
        sb.delete(0, sb.length());
    }

    public static void main(String[] args) throws IOException {
        String projectPath = "D:/data/IDEA workspace/wms-web";
        String[] pkgs = new String[]{"com.wms.junit"};

        createTestFile(projectPath, pkgs, true);
        //loadClass("com.wms.junit.Person", null);
    }

}
View Code

 

以上是关于IDEA Junit4配置的主要内容,如果未能解决你的问题,请参考以下文章

IDEA导入Junit4jar包

VSCode 配置 用户自定义代码片段 自定义自动代码补充

IDEA里运行代码时出现*** does not conform to org.specs.runner.JUnit4's selftype org.specs.runner.JUnits错误

idea com.intellij.junit4.JUnit4TestRunnerUtil$5 overrides final method getRunner.()Lorg/junit/runner

idea com.intellij.junit4.JUnit4TestRunnerUtil$5 overrides final method getRunner.()Lorg/junit/runner

idea com.intellij.junit4.JUnit4TestRunnerUtil$5 overrides final method getRunner.()Lorg/junit/runner