001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.wicket.spring.test; 018 019import java.io.IOException; 020import java.io.Serializable; 021import java.lang.annotation.Annotation; 022import java.util.Locale; 023import java.util.Map; 024 025import org.springframework.beans.BeansException; 026import org.springframework.beans.factory.BeanFactory; 027import org.springframework.beans.factory.NoSuchBeanDefinitionException; 028import org.springframework.beans.factory.ObjectProvider; 029import org.springframework.beans.factory.config.AutowireCapableBeanFactory; 030import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; 031import org.springframework.beans.factory.support.DefaultListableBeanFactory; 032import org.springframework.beans.factory.support.RootBeanDefinition; 033import org.springframework.context.ApplicationContext; 034import org.springframework.context.ApplicationEvent; 035import org.springframework.context.MessageSourceResolvable; 036import org.springframework.context.NoSuchMessageException; 037import org.springframework.context.support.AbstractApplicationContext; 038import org.springframework.core.ResolvableType; 039import org.springframework.core.io.Resource; 040 041/** 042 * Mock application context object. This mock context allows easy creation of unit tests by allowing 043 * the user to put bean instances into the context. 044 * 045 * @author Igor Vaynberg (ivaynberg) 046 * 047 */ 048public class ApplicationContextMock extends AbstractApplicationContext implements Serializable 049{ 050 private static final long serialVersionUID = 1L; 051 052 private final DefaultListableBeanFactory beanFactory; 053 private final long startupTime; 054 055 public ApplicationContextMock() { 056 this.beanFactory = new DefaultListableBeanFactory(); 057 beanFactory.setSerializationId(ApplicationContextMock.class.getName()); 058 startupTime = System.currentTimeMillis(); 059 } 060 061 /** 062 * puts bean with the given name into the context 063 * 064 * @param name 065 * @param bean 066 */ 067 public <T extends Object> void putBean(final String name, final T bean) 068 { 069 beanFactory.registerBeanDefinition(name, new RootBeanDefinition((Class<T>)bean.getClass(), () -> bean)); 070 } 071 072 /** 073 * puts bean with into the context. bean object's class name will be used as the bean name. 074 * 075 * @param bean 076 */ 077 public void putBean(final Object bean) 078 { 079 putBean(bean.getClass().getName(), bean); 080 } 081 082 @Override 083 public Object getBean(final String name) throws BeansException 084 { 085 return beanFactory.getBean(name); 086 } 087 088 @Override 089 public Object getBean(final String name, final Object... args) throws BeansException 090 { 091 return beanFactory.getBean(name, args); 092 } 093 094 @Override 095 @SuppressWarnings({ "unchecked" }) 096 public <T> T getBean(String name, Class<T> requiredType) throws BeansException 097 { 098 return beanFactory.getBean(name, requiredType); 099 } 100 101 @Override 102 @SuppressWarnings({ "unchecked" }) 103 public <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException 104 { 105 return beanFactory.getBeansOfType(type); 106 } 107 108 @Override 109 public <T> T getBean(Class<T> requiredType) throws BeansException 110 { 111 return beanFactory.getBean(requiredType); 112 } 113 114 @Override 115 public <T> T getBean(Class<T> requiredType, Object... objects) throws BeansException 116 { 117 return beanFactory.getBean(requiredType, objects); 118 } 119 120 @Override 121 public <T> ObjectProvider<T> getBeanProvider(Class<T> aClass) 122 { 123 return beanFactory.getBeanProvider(aClass); 124 } 125 126 @Override 127 public <T> ObjectProvider<T> getBeanProvider(ResolvableType resolvableType) 128 { 129 return beanFactory.getBeanProvider(resolvableType); 130 } 131 132 @Override 133 public Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) 134 throws BeansException 135 { 136 return beanFactory.getBeansWithAnnotation(annotationType); 137 } 138 139 @Override 140 public <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType) 141 { 142 return beanFactory.findAnnotationOnBean(beanName, annotationType); 143 } 144 145 @Override 146 public ApplicationContext getParent() 147 { 148 return null; 149 } 150 151 @Override 152 public String getDisplayName() 153 { 154 return ApplicationContextMock.class.getSimpleName(); 155 } 156 157 @Override 158 public long getStartupDate() 159 { 160 return startupTime; 161 } 162 163 @Override 164 public void publishEvent(final ApplicationEvent event) 165 { 166 throw new UnsupportedOperationException(); 167 } 168 169 @Override 170 public void publishEvent(Object o) 171 { 172 throw new UnsupportedOperationException(); 173 } 174 175 @Override 176 public boolean containsBeanDefinition(final String beanName) 177 { 178 return beanFactory.containsBean(beanName); 179 } 180 181 @Override 182 public int getBeanDefinitionCount() 183 { 184 return beanFactory.getBeanDefinitionCount(); 185 } 186 187 @Override 188 public String[] getBeanDefinitionNames() 189 { 190 return beanFactory.getBeanDefinitionNames(); 191 } 192 193 @Override 194 public <T> ObjectProvider<T> getBeanProvider(final Class<T> aClass, final boolean b) { 195 return beanFactory.getBeanProvider(aClass, b); 196 } 197 198 @Override 199 public <T> ObjectProvider<T> getBeanProvider(final ResolvableType resolvableType, final boolean b) { 200 return beanFactory.getBeanProvider(resolvableType, b); 201 } 202 203 @Override 204 public String[] getBeanNamesForType(ResolvableType resolvableType) 205 { 206 return beanFactory.getBeanNamesForType(resolvableType); 207 } 208 209 @Override 210 public String[] getBeanNamesForType(ResolvableType resolvableType, boolean includeNonSingletons, boolean allowEagerInit) 211 { 212 return beanFactory.getBeanNamesForType(resolvableType, includeNonSingletons, allowEagerInit); 213 } 214 215 @Override 216 public String[] getBeanNamesForType(final Class type) 217 { 218 return beanFactory.getBeanNamesForType(type); 219 } 220 221 @Override 222 public String[] getBeanNamesForType(Class type, boolean includeNonSingletons, 223 boolean allowEagerInit) 224 { 225 return beanFactory.getBeanNamesForType(type, includeNonSingletons, allowEagerInit); 226 } 227 228 @Override 229 public <T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, 230 boolean allowEagerInit) throws BeansException 231 { 232 return beanFactory.getBeansOfType(type, includeNonSingletons, allowEagerInit); 233 } 234 235 @Override 236 public String[] getBeanNamesForAnnotation(Class<? extends Annotation> aClass) 237 { 238 return beanFactory.getBeanNamesForAnnotation(aClass); 239 } 240 241 @Override 242 public boolean containsBean(final String name) 243 { 244 return beanFactory.containsBean(name); 245 } 246 247 @Override 248 public boolean isSingleton(final String name) throws NoSuchBeanDefinitionException 249 { 250 return beanFactory.isSingleton(name); 251 } 252 253 @Override 254 public Class<?> getType(final String name) throws NoSuchBeanDefinitionException 255 { 256 return beanFactory.getType(name); 257 } 258 259 @Override 260 public Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException 261 { 262 return beanFactory.getType(name, allowFactoryBeanInit); 263 } 264 265 @Override 266 public String[] getAliases(final String name) throws NoSuchBeanDefinitionException 267 { 268 return beanFactory.getAliases(name); 269 } 270 271 @Override 272 public BeanFactory getParentBeanFactory() 273 { 274 return beanFactory.getParentBeanFactory(); 275 } 276 277 @Override 278 public String getMessage(final String code, final Object[] args, final String defaultMessage, 279 final Locale locale) 280 { 281 throw new UnsupportedOperationException(); 282 } 283 284 @Override 285 public String getMessage(final String code, final Object[] args, final Locale locale) 286 throws NoSuchMessageException 287 { 288 throw new UnsupportedOperationException(); 289 } 290 291 @Override 292 public String getMessage(final MessageSourceResolvable resolvable, final Locale locale) 293 throws NoSuchMessageException 294 { 295 throw new UnsupportedOperationException(); 296 } 297 298 @Override 299 public Resource[] getResources(final String locationPattern) throws IOException 300 { 301 throw new UnsupportedOperationException(); 302 } 303 304 @Override 305 protected void refreshBeanFactory() throws BeansException, IllegalStateException { 306 } 307 308 @Override 309 protected void closeBeanFactory() { 310 } 311 312 @Override 313 public ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException { 314 return beanFactory; 315 } 316 317 @Override 318 public Resource getResource(final String location) 319 { 320 throw new UnsupportedOperationException(); 321 } 322 323 @Override 324 public AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException 325 { 326 return beanFactory; 327 } 328 329 @Override 330 public boolean containsLocalBean(final String name) 331 { 332 return beanFactory.containsLocalBean(name); 333 } 334 335 @Override 336 public boolean isPrototype(final String name) throws NoSuchBeanDefinitionException 337 { 338 return beanFactory.isPrototype(name); 339 } 340 341 @Override 342 public boolean isTypeMatch(String s, ResolvableType resolvableType) throws NoSuchBeanDefinitionException 343 { 344 return beanFactory.isTypeMatch(s, resolvableType); 345 } 346 347 @Override 348 public boolean isTypeMatch(final String name, final Class targetType) 349 throws NoSuchBeanDefinitionException 350 { 351 return beanFactory.isTypeMatch(name, targetType); 352 } 353}