`
dbp_cn
  • 浏览: 85893 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Junit单元测试子线程不执行

    博客分类:
  • java
 
阅读更多

养成写单元测试是个好习惯,这样能在前期把大部分边界问题测试清楚,减少代码的bug,提升项目上线的信心,但是我们在用junit进行单元测试的时候有时候会遇到很多坑,不断总结不但可以提高些代码的水平,还能避免下次再犯同类错误,最近就遇到一个用单元测试进行多线程测试的坑。

直接上代码:

public class RuleFilterThread{

public RuleFilterThread(Map<String, String> dataMap,  Rule rule, RuleFilter ruleFilter,Class<?> filterClass,Class ruleClass) {
        this.rule = rule;
        this.ruleFilter = ruleFilter;
        this.dataMap = dataMap;
        this.filterClass =filterClass;
        this.ruleClass=ruleClass;
    }

    @Override
        try {
            //compile class
            //TODO: optimize to cache compiled class .
//            Class<?> clazz = ClassLoaderUtil.loadClass(convertClassNameWithId(filterScript, ruleFilter.getId()));
            Object result = ClassLoaderUtil.execute(filterClass, FILTER_METHOD, dataMap);
            logger.info("execute rule filter result {}",result);
            if (!(result instanceof Boolean)) {
                logger.error("rule filter {} of rule {} filter method return value is not correct ,should return boolean value", ruleFilter.getId(), rule.getId());
                return;
            }

            if ((boolean) result) {
                logger.info("start handle sample rate ...");
                //采样率,qps等处理
                if (handleSapmleRate(rule.getSamplingRate())) {
                    logger.info("start to call rule script:{}",rule.getRuleScript());
                    // 调用规则配置
//                    Class<?> clazz1 = ClassLoaderUtil.loadClass(convertClassNameWithId(ruleScript, rule.getId()));
                    Object callRuleRes =  ClassLoaderUtil.execute(ruleClass, PROCESS_METHOD, dataMap);
                    System.out.println("result: "+callRuleRes);
                    // 验证结果保存
                    saveCheckResult((Map)callRuleRes, rule, dataMap, null);
                }
            }
        } catch (Exception e) {
            logger.error("Error occured  ", e);
            saveCheckResult(null, rule, dataMap, e);
        }

    }

    public static String convertClassNameWithId(String code, String className,int id) {
        return StringUtils.replace(code, className, className + id);
    }
}

写了一个线程来对数据进行规则过滤,其中用到了反射工具进行类执行,然后写了个单元测试:

  @Test
    public void testRuleThread()throws  Exception{
        Map map=new HashMap<String,String>();
        map.put("__biz_table_id","2");
        map.put("id","111");
        Rule rule=ruleRepository.findByBizTableId(Integer.parseInt((String)map.get("__biz_table_id")));
        RuleFilter ruleFilter=ruleFilterRepository.findByRuleId(rule.getId());

        Class<?> filterClass = ClassLoaderUtil.loadClass(RuleFilterThread.convertClassNameWithId(ruleFilter.getFilterScript(),"RuleFilter", ruleFilter.getId()));

        Class<?> ruleClass = ClassLoaderUtil.loadClass(RuleFilterThread.convertClassNameWithId(rule.getRuleScript(),"ProcessImp", rule.getId()));

        RuleFilterThread ruleFilterThread=new RuleFilterThread(map,rule,ruleFilter,filterClass,ruleClass);
       Thread t1= new Thread(ruleFilterThread);
       t1.start();
   //    t1.join();

    }

 这里其实没有就是先动态编译类,然后执行线程,但是在调试的时候,程序会半途终止,但是没有任何异常信息,开始以为是代码问题,但是尝试通过controller调用就没有任何问题,经过度娘才发现是junit不支持线程调用,当单元测试结束后,程序就会自己终止。

解决办法:

1,现场加上join方法,如上加入t1.join()即可

2,通过main方法测试就不会有此问题。

分享到:
评论

相关推荐

    JUNIT多线程测试

    然而,随着并发编程的普及,多线程测试成为了一个不可或缺的部分,因为我们需要确保我们的程序在并行执行时能够正常工作。本篇将深入探讨如何在JUnit中进行多线程测试,以及它的重要性。 首先,理解为什么需要进行...

    Junit单元测试(很经典)

    5. **Mock对象**:虽然Junit自身不提供模拟对象功能,但可以配合Mockito等库进行模拟对象测试,隔离依赖,专注于测试单个组件。 ### 高级篇 1. **注解驱动的测试**:利用`@RunWith`注解,可以指定不同的测试运行器...

    有关Junit和多线程测试的问题

    然而,当我们的应用涉及到多线程时,传统的JUnit测试可能会遇到挑战,因为多线程的并发行为往往难以预测,这导致测试的复杂性和困难度增加。在这种情况下,开发者需要寻找合适的工具和策略来解决这个问题。 ...

    Android JUnit单元测试实例

    一个简单的Android JUnit测试类通常会继承自`androidx.test.ext.junit.runners.AndroidJUnit4`。这个运行器使得我们可以在Android环境中使用JUnit 4的特性。例如: ```java import androidx.test.ext.junit.runners...

    Java多线程Junit测试GroboUtils-5.zip

    Java多线程与JUnit测试是软件开发中两个重要的概念,特别是在大型项目中,它们的结合使用对于提升代码质量、确保程序稳定性和优化性能至关重要。GroboUtils-5.zip这个压缩包很可能包含了一些辅助进行Java多线程测试...

    spring4+junit4.8 +多线程TheadTool

    Junit4.8则是Java单元测试的重要工具,它使得开发者可以方便地编写和执行测试用例,确保代码的正确性。而多线程在现代编程中扮演着关键角色,特别是在处理并发任务、提高系统效率时。 在"spring4+junit4.8 +多线程...

    关于JUnit测试单元测试

    JUnit是Java编程语言中最常用的单元测试框架之一,它允许开发者编写可重复运行的测试用例,以确保代码的正确性和稳定性。这篇文档将深入探讨JUnit的核心概念、使用方法以及其在实际开发中的重要性。 首先,我们要...

    android cts介绍,及junit测试

    综上所述,Android CTS和JUnit测试是Android开发不可或缺的部分,它们共同维护了Android生态系统的统一性和可靠性,同时也为开发者提供了可靠的测试工具,确保应用在多种设备上的表现。理解并熟练运用这两个工具,...

    junit5.jar

    这个名为"junit5.jar"的文件正是JUnit 5的核心库,它包含了执行单元测试所需的所有核心组件,包括JUnit Platform、JUnit Jupiter和JUnit Vintage。本文将全面解析JUnit 5的关键特性和使用方法。 首先,JUnit ...

    数据库框架ormlite和单元测试框架junit的使用

    JUnit是Java编程语言中最常用的单元测试框架,它为开发者提供了编写和执行测试用例的工具。通过JUnit,我们可以对代码的各个部分进行独立测试,确保每个方法的功能正常,提高代码质量。 在“数据库框架ORMLite和...

    JUnit in Action 3nd Edition

    Test Runner是JUnit的执行引擎,负责执行测试用例。Test Case是测试用例的集合,每个测试用例都包含多个测试方法。Assertion是JUnit中的断言机制,用于验证测试结果。 JUnit的优点 JUnit有许多优点,如提高代码质量...

    使用tempus-fugit多线程运行Junit Test

    然而,对于大型项目或性能密集型测试,单线程执行所有的测试用例可能会消耗大量时间。这时,利用多线程并行运行测试可以显著提升效率,这就是`tempus-fugit`库的作用。`tempus-fugit`是一个开源工具,专门设计用于...

    实用软件单元测试指导

    - **测试效果**:单元测试不仅能够发现代码中的浅层问题,还能揭示深层的设计缺陷,确保代码实现了预期的功能,并未执行不应有的操作。 - **成本控制**:早期发现并解决问题的成本远低于后期修复的成本。通过在单元...

    Junit5依赖整合包

    Junit5是Java开发中最常用的单元测试框架之一,它的出现为开发者提供了更加高效、灵活的测试体验。相较于之前的版本,Junit5引入了许多新的特性和改进,使得测试代码的编写和维护变得更加简单。本整合包包含了Junit5...

    testNG与Junit相同功能概要介绍

    首先,TestNG和JUnit都是单元测试框架,用于编写和执行针对代码单元的测试用例。单元测试是软件开发过程中的关键环节,能够确保代码片段的功能正确性,并在后续的开发和维护中提供保障。 TestNG由Cedric Beust创建...

    JBoss encore 工程和 JUnit测试自动生成工具2

    【JBoss encore工程与JUnit测试自动生成工具2详解】 在软件开发过程中,高效和便捷的开发工具对于提高生产力至关重要。JBoss encore是一个强大的框架,它为Java开发者提供了丰富的功能,加速了企业级应用的开发。本...

    junit的使用

    创建一个Junit测试通常包括以下步骤: 1. **创建测试类**:首先,我们需要创建一个继承自`androidx.test.ext.junit.runners.AndroidJUnit4`的测试类。这个类是AndroidX测试库提供的,它允许我们在Android环境下使用...

    JUnit_in_Action_01中文.pdf

    《JUnit in Action 01中文》是一本深入探讨JUnit测试框架的专业书籍,旨在帮助Java开发者理解和熟练运用这个广泛使用的单元测试工具。JUnit是Java编程语言中最流行和最强大的测试框架之一,它使得开发者能够轻松地...

Global site tag (gtag.js) - Google Analytics