网站建设的公司怎么收费自己做的网站怎么链接火车头采集
web/
2025/9/30 6:28:47/
文章来源:
网站建设的公司怎么收费,自己做的网站怎么链接火车头采集,wordpress调用指定文章id,建网站 赚钱oppo人岗匹配测评我们被迫在测试代码中写太多断言行的日子已经一去不复返了。 镇上有一个新的警长#xff1a;assertThat和他的代理人#xff1a;匹配者。 好吧#xff0c;这不是什么新东西#xff0c;但是无论如何#xff0c;我想向您介绍匹配器的使用方式#xff0c;然… oppo人岗匹配测评 我们被迫在测试代码中写太多断言行的日子已经一去不复返了。 镇上有一个新的警长assertThat和他的代理人匹配者。 好吧这不是什么新东西但是无论如何我想向您介绍匹配器的使用方式然后对匹配器概念进行扩展我发现在为我的代码开发单元测试时匹配器概念非常有用。 首先我将介绍匹配器的基本用法。 当然您可以直接从其作者那里完整地了解hamcrest匹配器功能 https://code.google.com/p/hamcrest/wiki/Tutorial 。 基本上匹配器是定义两个对象何时匹配的对象。 通常第一个问题是您为什么不使用等于 好吧有时您不想在它们的所有字段上都匹配两个对象而只是在其中的某些字段上匹配如果您使用旧代码则会发现equals实现不存在或不符合您的预期。 另一个原因是使用assertThat为您提供了一种更加一致的“断言”方法并且可以说是更具可读性的代码。 因此例如而不是编写 int expected, actual;
assertEquals(expected, actual); 你会写 assertThat(expected, is(actual)); 其中“ is”是静态导入的org.hamcrest.core.Is.is 并没有太大的区别……。 但是Hamcrest为您提供了许多非常有用的匹配器 对于数组和映射hasItemhasKeyhasValue 数字closeTo –一种指定相等性的方法其边距误差大于大于小于… 对象nullValuesameInstance 现在我们正在取得进步……Hamcrest匹配器的功能仍然是您可以为对象编写自己的匹配器。 您只需要扩展BaseMatcher T类。 这是一个简单的自定义匹配器的示例 public class OrderMatcher extends BaseMatcherOrder {private final Order expected;private final StringBuilder errors new StringBuilder();private OrderMatcher(Order expected) {this.expected expected;}Overridepublic boolean matches(Object item) {if (!(item instanceof Order)) {errors.append(received item is not of Order type);return false;}Order actual (Order) item;if (actual.getQuantity() ! (expected.getQuantity())) {errors.append(received item had quantity ).append(actual.getQuantity()).append(. Expected ).append(expected.getQuantity());return false;}return true;}Overridepublic void describeTo(Description description) {description.appendText(errors.toString());}Factorypublic static OrderMatcher isOrder(Order expected) {return new OrderMatcher(expected);}
} 与旧的断言方法相比这是一个全新的联盟。 因此这简而言之就是Hamcrest的匹配器的用法。 但是当我开始在现实生活中使用它时尤其是在使用遗留代码时我意识到故事还有很多。 这是使用匹配器时遇到的一些问题 匹配器的结构可能非常重复且无聊。 我需要一种将DRY原理应用于匹配器代码的方法。 我需要一种统一的方式来访问匹配器。 默认情况下框架应选择正确的匹配器。 我需要比较引用了另一个对象的对象这些对象应该已经与匹配器进行了比较对象引用可以根据需要进行深入处理 我需要使用匹配器检查对象集合而无需迭代该集合也可以使用数组匹配器…但我想要更多的J 我需要一个更灵活的匹配器。 例如对于同一个对象我需要检查一组字段但在另一种情况下则需要检查另一组。 开箱即用的解决方案是为每种情况配备一个匹配器。 不喜欢那样 我使用了一些约定知道了要应用哪个匹配器以及要比较或忽略哪个字段的匹配器层次结构克服了这些问题。 此层次结构的根是扩展BaseMatcher T的RootMatcher T。 为了处理1问题重复代码RootMatcher类包含所有匹配器的通用代码例如用于检查实际值是否为null或与预期对象具有相同类型甚至是相同类型的方法。同一实例 public boolean checkIdentityType(Object received) {if (received expected) {return true;}if (received null || expected null) {return false;}if (!checkType(received)){return false;}return true;}private boolean checkType(Object received) {if (checkType !getClass(received).equals(getClass(expected))) {error.append(Expected ).append(expected.getClass()).append( Received : ).append(received.getClass());return false;}return true;} 这将简化匹配器的编写方式我不必考虑null或恒等角情况 所有这些都在根类中解决了。 预期的对象和错误也位于根类中 public abstract class RootMatcher extends BaseMatcher {protected T expected;protected StringBuilder error new StringBuilder([Matcher : this.getClass().getName() ] ); 这样您可以在扩展RootMatcher之后立即进入match方法的实现而对于错误只需将消息放入StringBuilder中即可。 RootMatcher将处理将它们发送到JUnit框架以呈现给用户的情况。 对于问题2自动查找匹配项解决方案采用其工厂方法 Factorypublic static Matcher is(Object expected) {return getMatcher(expected, true);}public static RootMatcher getMatcher(Object expected, boolean checkType) {try {Class matcherClass Class.forName(expected.getClass().getName() Matcher);Constructor constructor matcherClass.getConstructor(expected.getClass());return (RootMatcher) constructor.newInstance(expected);} catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) {}return (RootMatcher) new EqualMatcher(expected);} 如您所见factory方法尝试使用两种约定来找出应该返回哪个匹配器 对象的匹配器具有对象名称字符串Matcher 匹配器与要匹配的对象位于同一包中建议位于同一包中但在测试目录中 使用此策略我成功使用了一个匹配器RootMatcher.is它将为我提供所需的确切匹配器 为了解决对象关系第3个问题的递归性质在检查对象字段时我使用了RootManager中的方法来检查将使用匹配器的相等性 public boolean checkEquality(Object expected, Object received) {String result checkEqualityAndReturnError(expected, received);return result null || result.trim().isEmpty();}public String checkEqualityAndReturnError(Object expected, Object received) {if (isIgnoreObject(expected)) {return null;}if (expected null received null) {return null;}if (expected null || received null) {return Expected or received is null and the other is not: expected expected received received;}RootMatcher matcher getMatcher(expected);boolean result matcher.matches(received);if (result) {return null;} else {StringBuilder sb new StringBuilder();matcher.describeTo(sb);return sb.toString();}} 但是关于集合问题4呢 为了解决这个问题您要做的就是为扩展RootMatcher的集合实现匹配器。 因此唯一剩下的问题是5使匹配器更加灵活能够告诉匹配器它应该忽略哪个字段以及应该考虑哪个字段。 为此我介绍了“ ignoreObject”的概念。 当匹配器在模板预期对象中找到对其的引用时该对象将忽略该对象。 它是如何工作的 首先在RootMatcher中我提供了用于返回任何Java类型的ignore对象的方法 private final static Map ignorable new HashMap();static {ignorable.put(String.class, %%%%IGNORE_ME%%%%);ignorable.put(Integer.class, new Integer(Integer.MAX_VALUE - 1));ignorable.put(Long.class, new Long(Long.MAX_VALUE - 1));ignorable.put(Float.class, new Float(Float.MAX_VALUE - 1));}/*** we will ignore mock objects in matchers*/private boolean isIgnoreObject(Object object) {if (object null) {return false;}Object ignObject ignorable.get(object.getClass());if (ignObject ! null) {return ignObject.equals(object);}return Mockito.mockingDetails(object).isMock();}SuppressWarnings(unchecked)public static M getIgnoreObject(Class clazz) {Object obj ignorable.get(clazz);if (obj ! null) {return (M) obj;}return (M) Mockito.mock(clazz);}SuppressWarnings(unchecked)public static M getIgnoreObject(Object obj) {return (M) getIgnoreObject(obj.getClass());} 如您所见被忽略的对象将是被模拟的对象。 但是对于无法模拟的类最终类我提供了一些不太可能出现的任意固定值可以对J进行改进。 为此开发人员必须使用RootMatcher中提供的equals方法checkEqualityAndReturnError它将检查是否忽略了对象。 使用我去年提出的这种策略和构建器模式 http://www.javaadvent.com/2012/12/using-builder-pattern-in-junit-tests.html 我可以轻松地对复杂的结构做出断言目的 import static […]RootMatcher.is;
Order expected OrderBuilder.anOrder().withQuantity(2).withTimestamp(RootManager.getIgnoredObject(Long.class)).withDescription(“specific description”).build()
assertThat(order, is(expected); 如您所见我可以轻松地指定应忽略时间戳记这使我可以将同一匹配器与要验证的一组完全不同的字段一起使用。 确实此策略需要进行大量准备从而使所有构建者和匹配者都受益。 但是如果我们要拥有经过测试的代码并且要使测试成为主要关注应涵盖的测试流程的工作那么我们需要这样的基础和这些工具来帮助我们轻松地建立前提条件和建立我们的预期状态。 当然可以使用注释来改进实现但是核心概念仍然存在。 我希望本文能帮助您改善测试风格如果有足够的兴趣我会尽力将完整的代码放在公共存储库中。 谢谢。 参考来自Java日历日历博客的JCG合作伙伴 Stefan Bulzan 在测试中使用匹配器 。 翻译自: https://www.javacodegeeks.com/2013/12/using-matchers-in-tests.htmloppo人岗匹配测评
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84304.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!