养成写单元测试是个好习惯,这样能在前期把大部分边界问题测试清楚,减少代码的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中进行多线程测试,以及它的重要性。 首先,理解为什么需要进行...
5. **Mock对象**:虽然Junit自身不提供模拟对象功能,但可以配合Mockito等库进行模拟对象测试,隔离依赖,专注于测试单个组件。 ### 高级篇 1. **注解驱动的测试**:利用`@RunWith`注解,可以指定不同的测试运行器...
然而,当我们的应用涉及到多线程时,传统的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多线程测试...
Junit4.8则是Java单元测试的重要工具,它使得开发者可以方便地编写和执行测试用例,确保代码的正确性。而多线程在现代编程中扮演着关键角色,特别是在处理并发任务、提高系统效率时。 在"spring4+junit4.8 +多线程...
JUnit是Java编程语言中最常用的单元测试框架之一,它允许开发者编写可重复运行的测试用例,以确保代码的正确性和稳定性。这篇文档将深入探讨JUnit的核心概念、使用方法以及其在实际开发中的重要性。 首先,我们要...
综上所述,Android CTS和JUnit测试是Android开发不可或缺的部分,它们共同维护了Android生态系统的统一性和可靠性,同时也为开发者提供了可靠的测试工具,确保应用在多种设备上的表现。理解并熟练运用这两个工具,...
这个名为"junit5.jar"的文件正是JUnit 5的核心库,它包含了执行单元测试所需的所有核心组件,包括JUnit Platform、JUnit Jupiter和JUnit Vintage。本文将全面解析JUnit 5的关键特性和使用方法。 首先,JUnit ...
JUnit是Java编程语言中最常用的单元测试框架,它为开发者提供了编写和执行测试用例的工具。通过JUnit,我们可以对代码的各个部分进行独立测试,确保每个方法的功能正常,提高代码质量。 在“数据库框架ORMLite和...
Test Runner是JUnit的执行引擎,负责执行测试用例。Test Case是测试用例的集合,每个测试用例都包含多个测试方法。Assertion是JUnit中的断言机制,用于验证测试结果。 JUnit的优点 JUnit有许多优点,如提高代码质量...
然而,对于大型项目或性能密集型测试,单线程执行所有的测试用例可能会消耗大量时间。这时,利用多线程并行运行测试可以显著提升效率,这就是`tempus-fugit`库的作用。`tempus-fugit`是一个开源工具,专门设计用于...
- **测试效果**:单元测试不仅能够发现代码中的浅层问题,还能揭示深层的设计缺陷,确保代码实现了预期的功能,并未执行不应有的操作。 - **成本控制**:早期发现并解决问题的成本远低于后期修复的成本。通过在单元...
Junit5是Java开发中最常用的单元测试框架之一,它的出现为开发者提供了更加高效、灵活的测试体验。相较于之前的版本,Junit5引入了许多新的特性和改进,使得测试代码的编写和维护变得更加简单。本整合包包含了Junit5...
首先,TestNG和JUnit都是单元测试框架,用于编写和执行针对代码单元的测试用例。单元测试是软件开发过程中的关键环节,能够确保代码片段的功能正确性,并在后续的开发和维护中提供保障。 TestNG由Cedric Beust创建...
【JBoss encore工程与JUnit测试自动生成工具2详解】 在软件开发过程中,高效和便捷的开发工具对于提高生产力至关重要。JBoss encore是一个强大的框架,它为Java开发者提供了丰富的功能,加速了企业级应用的开发。本...
创建一个Junit测试通常包括以下步骤: 1. **创建测试类**:首先,我们需要创建一个继承自`androidx.test.ext.junit.runners.AndroidJUnit4`的测试类。这个类是AndroidX测试库提供的,它允许我们在Android环境下使用...
《JUnit in Action 01中文》是一本深入探讨JUnit测试框架的专业书籍,旨在帮助Java开发者理解和熟练运用这个广泛使用的单元测试工具。JUnit是Java编程语言中最流行和最强大的测试框架之一,它使得开发者能够轻松地...