spring测试用例环境搭建
为方便理解spring,记录对spring的分析
1. pom.xml
justwriteit
com.dsq.justwriteit
1.0-SNAPSHOT
4.0.0
spring5
5.1.1.RELEASE
org.springframework
spring-context
${spring.version}
org.springframework
spring-test
${spring.version}
test
org.aspectj
aspectjweaver
1.9.2
org.slf4j
slf4j-api
1.7.25
junit
junit
4.12
org.slf4j
slf4j-log4j12
1.7.25
2. log4j.properties
log4j.rootLogger = INFO,CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} [%l] %m%n
3. 代码
总的代码结构图:
构图.png)
-
PrintBeforeAspect (简单的切面类)
package com.dsq.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Aspect @Component public class PrintBeforeAspect { private Logger logger = LoggerFactory.getLogger(PrintBeforeAspect.class); @Pointcut("execution(public * com.dsq.*.*.print(..))") public void action() { } @Before("action()") public void before(JoinPoint joinPoin) { logger.info("PrintBeforeAspect before"); logger.info("" + joinPoin); } }
SpringConfig (配置类)
package com.dsq.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration
@ComponentScan("com.dsq")
@EnableAspectJAutoProxy
public class SpringConfig {
}
- FactoryPostProcessor (BeanFactory后处理器)
package com.dsq.postprocessor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
@Component
public class FactoryPostProcessor implements BeanFactoryPostProcessor {
private Logger logger = LoggerFactory.getLogger(FactoryPostProcessor.class);
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory)
throws BeansException {
logger.info("******BeanFactoryPostProcessor");
String[] beanStr = configurableListableBeanFactory.getBeanDefinitionNames();
for (String beanName : beanStr) {
logger.info(beanName);
if(beanName.equals("userServiceImpl")) {
BeanDefinition beanDefinition = configurableListableBeanFactory
.getBeanDefinition(beanName);
MutablePropertyValues m = beanDefinition.getPropertyValues();
m.addPropertyValue("username", "lisi");
logger.info("change username");
}
}
}
}
- MyBeanPostProcessor (Bean 后处理器)
package com.dsq.postprocessor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
Logger logger = LoggerFactory.getLogger(MyBeanPostProcessor.class);
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
logger.info(beanName + " : " + bean);
/*if(bean instanceof LogService) {
throw new RuntimeException();
}*/
return bean;
}
}
- LogService (service 接口)
package com.dsq.service;
public interface LogService {
void log(String message);
}
- UserService (service 接口)
package com.dsq.service;
public interface UserService {
void print(String name);
void log(String message);
}
- LogServiceImpl
package com.dsq.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.dsq.service.LogService;
import com.dsq.service.UserService;
@Service
public class LogServiceImpl implements LogService{
Logger logger = LoggerFactory.getLogger(LogServiceImpl.class);
@Autowired
private UserService userService;
public void log(String message) {
logger.info(message);
}
}
- Person
package com.dsq.service.impl;
public class Person {
String id;
String email;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Person [id=" + id + ", email=" + email + "]";
}
}
- PersonService
package com.dsq.service.impl;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;
@Component
public class PersonService implements FactoryBean{
public Person getObject() throws Exception {
Person person = new Person();
person.setId("1");
person.setEmail("[email protected]");
return person;
}
public Class> getObjectType() {
return Person.class;
}
}
- UserServiceImpl
~~~java
package com.dsq.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.dsq.service.LogService;
import com.dsq.service.UserService;
@Service
public class UserServiceImpl implements UserService{
private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
private String username;
@Autowired
private LogService logService;
public void print(String name) {
logger.info(name);
logger.info(username);
}
public void log(String message) {
logService.log(message);
}
public void setUsername(String username) {
this.username = username;
}
}
~~~
- UserServiceTest (测试类)
~~~java
package com.dsq.service;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.dsq.config.SpringConfig;
import com.dsq.service.impl.Person;
import com.dsq.service.impl.PersonService;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class UserServiceTest {
@Autowired
UserService userService;
@Autowired
ApplicationContext applicationContext;
Logger logger = LoggerFactory.getLogger(UserServiceTest.class);
@BeforeClass
public static void beforeClass() {
}
@Test
public void testCount() {
logger.info("BeanDefinitionCount : " + applicationContext.getBeanDefinitionCount());
}
@Test
public void getPrint() {
userService.print("aa");
}
@Test
public void getPerson() {
logger.info("PersonService : " + applicationContext.getBean(PersonService.class));
logger.info("Person : " + applicationContext.getBean(Person.class));
}
@Test
public void log() {
userService.log("bbbbbbbbbbb");
}
}
~~~
运行最后的测试类,测试环境就搭建好了!