• 单元测试


    一 、Junit
     
    1、环境配置

         使用idea IDE 进行单元测试,首先需要安装JUnit 插件。

              1.安装JUnit插件步骤

                  File-->settings-->Plguins-->Browse repositories-->输入JUnit-->选择JUnit Generator V2.0安装(可以自动生成测试代码)。

              2.使用JUnit插件

                 在需要进行单元测试的类中,在需要测试的类文件里点击code->Generate(使用快捷键alt+insert,选择JUnit test,选择JUnit4。
     
    注意:IDEA自带的JUnit插件和JUnitGeneratorV2.0插件都要勾选上,若只勾选JUnit可能导致无法自动生成测试文件,若只勾选JUnitGenerator V2.0可能导致生成的测试文件无法运行
     
    2、生成测试代码
    选中要测试的类,右键—>go to —>指定生成到测试类test

     

    生成的测试类就放到Test下面:

     

    3、写测试代码
    常用注解:
    (1)@BeforeClass所修饰的方法在所有方法加载前执行,而且他是静态的在类加载后就会执行该方法,在内存中只有一份实例,适合用来加载配置文件。
    (2)@AfterClass所修饰的方法在所有方法执行完毕之后执行,通常用来进行资源清理,例如关闭数据库连接。
    (3)@Before和@After在每个测试方法执行前都会执行一次。
    (4)@Test(excepted=XX.class) 在运行时忽略某个异常。
    (5)@Test(timeout=毫秒) 允许程序运行的时间。
    (6)@Ignore 所修饰的方法被测试器忽略。
    (7)RunWith 可以修改测试运行器 org.junit.runner.Runner
     

    Assert类中定义了很多静态方法来进行断言。列表如下:

    • assertTrue(String message, boolean condition) 要求condition == true
    • assertFalse(String message, boolean condition) 要求condition == false
    • fail(String message) 必然失败,同样要求代码不可达
    • assertEquals(String message, XXX expected,XXX actual) 要求expected.equals(actual)
    • assertArrayEquals(String message, XXX[] expecteds,XXX [] actuals) 要求expected.equalsArray(actual)
    • assertNotNull(String message, Object object) 要求object!=null
    • assertNull(String message, Object object) 要求object==null
    • assertSame(String message, Object expected, Object actual) 要求expected == actual
    • assertNotSame(String message, Object unexpected,Object actual) 要求expected != actual
    • assertThat(String reason, T actual, Matcher matcher) 要求matcher.matches(actual) == true

     

    4、私有方法的单元测试
    一般只有public修饰的方法才可以写单元测试,如果想要对私有的方法也做单元测试,可以用invoke(类反射):
    实现方法:
    public Object invoke(Object obj,Object... args)throws IllegalAccessException,IllegalArgumentException,InvocationTargetException
    用法:
    (1)获取该类的Class Type;
    (2)通过getMethod方法获取Method对象;
    (3)通过调用invoke方法来执行对象的某个方法:invoke(class, method)
     
    例如对下面的私有方法进行单元测试:
    private void validateArg(NightFreqInput param) throws IOException {
            if (param == null) {
                throw new IOException("RelationshipParam Exception: Param is null");
            } else {
                if (StringUtils.isEmpty(param.getStartTime())) {
                    throw new IllegalArgumentException("StartTime can't be empty!");
                }
                if (StringUtils.isEmpty(param.getEndTime())) {
                    throw new IllegalArgumentException("EndTime can't be empty!");
                }
        }
        }
     @Test
        public void validateArgTest() throws Exception {
         NightFreqInput param = new NightFreqInput();
         param.setStartTime("2018-08-10 00:00:00");
         param.setEndTime("2018-08-10 23:59:59");
         Class clazz = Class.forName("com.*.*.hbase.NightFreqSearch.NightFreqSearch");
         NightFreqSearch nfs = new NightFreqSearch();
         Method m = clazz.getDeclaredMethod("validateArg",NightFreqInput.class); //第一个参数是方法的名字,第二个参数是方法的参数的class type
         m.setAccessible(true);//Accessable属性是继承自AccessibleObject 类. 功能是启用或禁用安全检查,setAccessible(true)则不启用安全检查
    
         m.invoke(nfs,param);
        }

     有关mock的部分参见:

    https://www.ibm.com/developerworks/cn/java/j-easymock.html?spm=a2c4e.11153940.blogcont44685.10.12a9665aivnitV

     
  • 相关阅读:
    百度关键词搜索量查询,百度,谷歌关键词查询工具
    推荐免费服务免费空间服务器检测
    如何成为能让大家尊重的程序员
    四天玩转windows phone开发视频之第二天总结
    用三张图片详解Asp.Net 全生命周期
    程序员该如何规划自己的人生
    博客正式开通啦!
    技术与创业不矛盾(两者是先后关系)
    工作五年的感悟
    委托与事件以及应用
  • 原文地址:https://www.cnblogs.com/zling/p/10456126.html
Copyright © 2020-2023  润新知