根据我以前的帖子,我正在撰写有关“单一责任原则”的演讲。 我花了大部分时间。
同时,我想分享一个示例代码,说明如何在类中测试内部字段。 我这样做是为了进行特殊的测试,这更多的是集成测试。 在依赖类的标准单元测试中,我正在使用依赖的模拟。
事实
- 所有字段(以及我们类中的依赖项都是私有的
- 该类没有依赖项的获取器
- 我们使用Spring(XML上下文)进行连接
- 我想验证依赖接口A是否正确连接到依赖类B
一种方法是连接所有内容,然后运行某种形式的逻辑集成测试。 我不想这么做 这将使测试难以维护。
另一种方法是直接检查接线。 为此,我正在使用反射。
以下是测试方法及其用法的示例代码。 请注意,如果出现问题,我将如何捕获异常并引发RuntimeException。 这样,我就获得了更干净的测试代码。
// Somewhere in a different utility class for testing@SuppressWarnings("unchecked")public static <T> T realObjectFromField(Class<?> clazz, String fieldName, Object object) {Field declaredField = accessibleField(clazz, fieldName);try {return (T) declaredField.get(object);} catch (IllegalArgumentException | IllegalAccessException e) {throw new RuntimeException(e);}}private static Field accessibleField(Class<?> clazz, String fieldName) {try {Field declaredField = clazz.getDeclaredField(fieldName);declaredField.setAccessible(true);return declaredField;} catch (NoSuchFieldException | SecurityException e) {throw new RuntimeException(e);}}// This is how we use it in a test methodimport static mypackage.ReflectionUtils.realObjectFromField;ItemFiltersMapperByFlag mapper = realObjectFromField(ItemsFilterExecutor.class, "filtersMapper", filterExecutor);assertNotNull("mapper is null. Check wiring", mapper);
参考: 《 学习与改进》中的 JCG合作伙伴 Eyal Golan 作为Craftsman Developer博客使用“反射进行测试” 。
翻译自: https://www.javacodegeeks.com/2014/02/using-reflection-for-testing.html