泰州网站设计企业门户网站案例

张小明 2025/12/25 0:04:15
泰州网站设计,企业门户网站案例,关键词分为哪三类,一般网站建设公司好当你在本地、测试环境和 CI 中跑同一组测试时#xff0c;是否遇到过这样的困惑#xff1a;同一段业务逻辑在不同配置、不同 Locale 下的表现不尽相同#xff0c;但你又不想为每种场景复制一堆几乎一样的测试类#xff1f;如果把所有分支逻辑都塞进一个测试方法里#xff0…当你在本地、测试环境和 CI 中跑同一组测试时是否遇到过这样的困惑同一段业务逻辑在不同配置、不同 Locale 下的表现不尽相同但你又不想为每种场景复制一堆几乎一样的测试类如果把所有分支逻辑都塞进一个测试方法里又会让测试变得臃肿难以维护。有没有一种方式可以让测试代码保持简洁却能优雅地在多种“环境切面”下重复执行整套测试这正是 JUnit 5 中ClassTemplate想要解决的问题。本文就从这个现实场景出发带你深入理解 Class Template 的执行机制、扩展点设计以及一个实用的多 Locale 示例。1. 引言有些测试需要在不同的环境中运行。ClassTemplate注解可以帮我们做到这一点它会让整个测试类在多种不同配置下被重复执行。在这篇教程中我们会先讨论为什么会有“类模板Class Template”这种机制以及 JUnit 是如何执行它们的接着会看看它在整体执行模型中的位置最后我们会拆解类模板的结构、背后的提供者provider并通过一个示例在不复制任何测试代码的前提下让同一个测试类在多个 Locale 环境下运行。2. 什么是ClassTemplate简单回顾一下ClassTemplate会把一个测试类变成“模板类”让它按照不同的调用上下文invocation context多次执行。提供者负责提供这些上下文每一个上下文都会触发一次独立的执行拥有各自的生命周期和扩展。在实践中这让我们可以在不同环境或配置下多次运行同一个测试类同时保持测试代码本身的简单性。我们可以改变运行时的环境配置而不用复制测试类或者在单个测试方法里加入复杂的分支逻辑。2.1. Class Template 如何执行一个类模板由两部分组成模板类本身以及为其提供调用上下文的提供者。模板类在外观上就像一个普通的 JUnit 测试类但ClassTemplate注解会告诉 JUnit 不要直接运行它而是等待提供者来定义该类的具体执行方式。一旦 JUnit 识别出某个类是类模板提供者就会返回一个或多个上下文每个上下文都定义了一次完整的执行。对于每个上下文JUnit 都会创建一个新的测试实例应用对应的扩展并执行生命周期方法和测试方法。这样测试类可以专注于业务逻辑本身而由提供者来塑造运行时环境。2.2. Class Template 与 Method Template 对比在继续之前值得先对比一下类模板和方法模板method template之间的区别。两者都支持重复执行但关注的层级不同。方法模板会在不同输入下重复执行同一个测试方法而类模板则会重复执行整个测试类包括它的生命周期回调、扩展以及配置。因此当变化点主要体现在整体环境层面——例如 Locale、特性开关或系统级配置——而不是单个方法参数时类模板会更加合适。3. 调用上下文提供者接下来我们看看“调用上下文提供者invocation context provider”。这个扩展负责为类模板提供执行上下文。它需要实现ClassTemplateInvocationContextProvider接口该接口定义了两个核心方法用来决定提供者如何参与测试执行。下面我们分别来看。3.1.supportsClassTemplate()方法在 JUnit 使用某个提供者之前它会先检查该提供者是否适用于当前正在发现的测试类。这个检查就是通过supportsClassTemplate()方法完成的OverridepublicbooleansupportsClassTemplate(ExtensionContextcontext){returncontext.getTestClass().map(aClass-aClass.isAnnotationPresent(ClassTemplate.class)).orElse(false);}JUnit 会对每一个已注册的提供者调用这个方法。只有返回true的提供者才会对当前类模板生效。通过这种机制JUnit 可以避免提供者被意外激活避免在无关测试上运行扩展同时也允许多个提供者并存而互不干扰。3.2.provideClassTemplateInvocationContexts()方法一旦某个提供者被激活JUnit 就会调用provideClassTemplateInvocationContexts()以获取描述模板执行方式的上下文OverridepublicStreamClassTemplateInvocationContextprovideClassTemplateInvocationContexts(ExtensionContextcontext){returnStream.of(invocationContext(A),invocationContext(B));}每一个上下文都代表了一次对测试类的完整执行。单个提供者可以提供一个或多个上下文如果同时有多个提供者处于激活状态JUnit 会把它们提供的流拼接起来。每个上下文都可以添加自己的扩展或配置从而让提供者可以对该次执行的环境进行精细控制。从这里开始JUnit 会为每个上下文创建一个新的测试类实例应用对应的扩展并完整运行生命周期方法和测试方法各一次。4. 实用示例为了更直观地理解这些概念我们来构造一个示例编写一个测试用来验证在多个 JVM Locale 下的日期格式化逻辑。由于 Locale 会影响整个执行环境这类需求非常适合用类模板来实现。我们只保留一个测试类然后让提供者在不同配置下多次执行它。4.1. 日期格式化逻辑首先从一个小工具类开始它使用当前 JVM 默认 Locale 来格式化日期。只要默认 Locale 发生变化它的输出就会随之改变classDateFormatter{publicStringformat(LocalDatedate){DateTimeFormatterformatterDateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).withLocale(Locale.getDefault());returndate.format(formatter);}}有了这个类之后我们就可以在多种不同的配置下验证它的行为而这些配置都由类模板来提供。4.2. 提供者与扩展为了支撑上述需求我们首先需要一个扩展用来在单次执行期间设置默认 LocaleclassLocaleExtensionimplementsBeforeEachCallback,AfterEachCallback{privatefinalLocalelocale;privateLocaleprevious;OverridepublicvoidbeforeEach(ExtensionContextcontext){previousLocale.getDefault();Locale.setDefault(locale);}OverridepublicvoidafterEach(ExtensionContextcontext){Locale.setDefault(previous);}}这个扩展会在每次测试之前暂时替换 JVM 的默认 Locale并在测试结束后恢复原有值。在不同执行之间唯一变化的就是传入该扩展的Locale实例。接下来提供者会通过provideClassTemplateInvocationContexts()方法来提供不同的上下文。每个上下文都由invocationContext()方法创建该方法通过getDisplayName()指定显示名并通过getAdditionalExtensions()安装对应的LocaleExtensionclassDateLocaleClassTemplateProviderimplementsClassTemplateInvocationContextProvider{OverridepublicStreamClassTemplateInvocationContextprovideClassTemplateInvocationContexts(ExtensionContextcontext){returnStream.of(Locale.US,Locale.GERMANY,Locale.ITALY,Locale.JAPAN).map(this::invocationContext);}privateClassTemplateInvocationContextinvocationContext(Localelocale){returnnewClassTemplateInvocationContext(){OverridepublicStringgetDisplayName(intinvocationIndex){returnLocale: locale.getDisplayName();}OverridepublicListExtensiongetAdditionalExtensions(){returnList.of(newLocaleExtension(locale));}};}}通过这样的配置我们就得到了互不相同的执行环境最终会对同一个测试类执行四次测试。4.3. Class Template 测试此时类模板的整体配置已经就位我们就可以专注于编写一个测试方法了。JUnit 会通过前面配置好的提供者为每个上下文执行一次这个方法privatefinalDateFormatterformatternewDateFormatter();TestvoidgivenDefaultLocale_whenFormattingDate_thenMatchesLocalizedOutput(){LocalDatedateLocalDate.of(2025,9,30);DateTimeFormatterexpectedFormatterDateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).withLocale(Locale.getDefault());Stringexpecteddate.format(expectedFormatter);Stringformattedformatter.format(date);LOG.info(Locale: {}, Expected: {}, Formatted: {},Locale.getDefault(),expected,formatted);assertEquals(expected,formatted);}在每次执行中测试都会基于当前默认 Locale 计算预期值并与DateFormatter的输出进行比较。类模板和提供者负责在每次执行之间切换环境设置因此测试代码本身可以保持简单、干净不需要任何分支逻辑。4.4. 测试输出最后当我们运行这组测试时同一个测试类会在每个 Locale 下执行一次而每次的格式化结果都不相同Locale: en_US, Expected: September 30, 2025, Formatted: September 30, 2025 Locale: de_DE, Expected: 30. September 2025, Formatted: 30. September 2025 Locale: it_IT, Expected: 30 settembre 2025, Formatted: 30 settembre 2025 Locale: ja_JP, Expected: 2025年9月30日, Formatted: 2025年9月30日可以看到每一行都对应于一个调用上下文。测试代码在这些运行之间完全没有变化变化的只是由提供者和扩展配置出来的执行环境。5. 总结在本文中我们从基础概念出发进一步深入了ClassTemplate的使用方式重点考察了提供者如何为单个测试类提供多个执行上下文。通过 Locale 示例我们看到提供者和扩展可以在不修改测试代码的前提下灵活地切换测试环境。这使得类模板成为处理全局设置或配置级行为测试的一种干净而优雅的解决方案。感谢阅读如果您对Java内容感兴趣也可以关注我的Java专题内容。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

专注扬中网站建设黄岛因特网站建设公司

番茄小说下载神器:3大场景应用完整指南 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 在数字化阅读时代,你是否也遇到过这样的烦恼:网络信号不稳定时无…

张小明 2025/12/25 0:02:14 网站建设

网站收录差上海域名网站吗

高拟真数字人怎么造?Linly-Talker给你标准答案 在直播带货间里24小时不眠不休的虚拟主播,教育平台上娓娓道来的AI讲师,银行APP中耐心解答问题的数字客服——这些曾经只存在于科幻电影中的场景,正悄然成为现实。而支撑这一切的核心…

张小明 2025/12/25 0:00:13 网站建设

网站方案编写石家庄建设局

对于想入行网络安全的新人来说,最常困惑的问题莫过于:“零基础转行,需要学习多久才能上手?” 其实,网络安全入门门槛比想象中低,关键在于理清技术领域的分类特点,再制定科学的学习路径。 只要…

张小明 2025/12/24 23:58:12 网站建设

肥城网站制作开网店怎么和快递合作便宜

1 CEC 介绍 CEC(Congress on Evolutionary Computation) 作为进化计算领域的顶级国际会议,自 2005 年起系统性构建并持续更新标准测试函数集,该框架已成为优化算法性能评估的黄金标准。 2 CEC 测试集介绍 CEC 测试集涵盖了多个…

张小明 2025/12/24 23:56:11 网站建设

网站标题作弊详解朝阳网站制作设计

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 构建一个性能优化的JSON可视化工具&#xff0c;要求&#xff1a;1. 实现极速加载&#xff08;<100ms渲染1MB JSON&#xff09; 2. 内存占用不超过50MB 3. 支持百万级数组的虚拟滚…

张小明 2025/12/24 23:52:07 网站建设

邯郸网站建设xy0310制作网站的程序语言

经典逻辑、门电路与可逆计算 在计算机科学领域,经典逻辑、门电路以及可逆计算是构建计算机系统的重要基础概念。接下来,我们将深入探讨这些概念的原理、特性以及它们之间的联系。 1. 经典逻辑与门电路基础 在进行数值相加时,如 6 和 5 相加,可能得到个位数字 1 和进位 1,…

张小明 2025/12/24 23:50:06 网站建设