junit与Spring结合
Posted 二十年后20
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了junit与Spring结合相关的知识,希望对你有一定的参考价值。
配置:右键要加入单元测试的工程,选择properties,然后选择java build path,选择add library,选择junit即可。
编写:右键要测试的class,new一个junit test case,更改其source folder,next之后可选择要测试的class中的要测试的方法,则可自动生成。
运行:右键要运行单元测试的class,选择junit即可。
测试套件测试:
1.测试套件就是组织测试类一起运行的。
2.写一个作为测试套件的入口类,这个类里不包含其他的方法,更改测试运行器Suite.class,将要测试的类作为数组传入到Suite.SuiteClasses({}),即如下图:
参数化设置测试:
1.更改默认的测试运行器为@RunWith(Parameterized.class)
2.声明变量来存放预期值和结果值
3.声明一个返回值为Collection的公共静态方法,并使用@Parameters进行修饰
4.为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值。示例代码如下图:
注意:
1.单元测试代码最好与业务代码分开,对于每一个要测试的class,所生成的单元测试的class,两者包名要保持一致。
2.测试方法必须用@Test进行修饰。
3.测试方法必须使用public void进行修饰,不能带任何参数。
4.测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖。
5.测试类最好使用Test作为类名的后缀。
6.测试方法最好使用test作为方法名的前缀。
流程点:
1.@BeforeClass修饰的方法会在所有方法被调用前被执行,而且该方法时静态的,所以当测试类被加载后接着就会运行它,而且在内存中它只会存在一份实例,它比较适合加载配置文件。
2.@AfterClass所修饰的方法通常用来对资源的清理,如关闭数据库的链接。
3.@Before和@After会在每个测试方法的前后各执行一次。
4.@Ignore所修饰的测试方法会被测试运行器忽略。
5.@RunWith可以更改测试运行器
UnitTestBase的写入:
1 public class UnitTestBase { 2 private ClassPathXmlApplicationContext context; 3 private String springXmlpath; 4 public UnitTestBase() {}; 5 6 public UnitTestBase(String springXmlpath) { 7 this.springXmlpath = springXmlpath; 8 } 9 10 @Before 11 public void before() { 12 if(StringUtils.isEmpty(springXmlpath)) { 13 springXmlpath = "classpath*:spring-*.xml";//配置文件路径通过构造函数传入, 14 } 15 try { 16 context = new ClassPathXmlApplicationContext(springXmlpath.split("[,\\\\s]+"));//创建spring的容器context 17 context.start();//启动后查找配置文件里面配置的信息,并解析这些文件,然后装载到spring的上下文,即context里, 18 } catch(BeansException e) { 19 e.printStackTrace(); 20 } 21 } 22 23 @After 24 public void after() { 25 context.destroy(); 26 } 27 28 @SuppressWarnings("unchecked") 29 protected <T extends Object> T getBean(String beanId) { 30 return (T)context.getBean(beanId);//通过getBean方法获取相应的对象,而这里的beanId即是子类中传入的oneInterface,也在spring-ioc.xml文件中配置过的bean 31 } 32 33 protected <T extends Object> T getBean(Class<T> clazz) { 34 return context.getBean(clazz); 35 } 36 37 }
@Before也就是执行之前的内容,先加载配置文件,而配置文件的路径,从UnitTestBase的子类中通过构造方法获取,这里的classpath*:spring-*.xml是匹配所有以spring-开头的xml文件。创建Spring的容器,这里也就是context,当其启动后,会查找配置文件中的信息,并将信息加载到context容器中,当要使用这些信息时,可以用getBean方法获取到相应的对象,其中getBean的参数名称应该是xml中配置过的对象名称,这里也就是injectionService,这里不能直接get到injectionDao,至于原因?还未解。。。而getBean相对于new最大的好处就是,不用每次要用到某个对象的时候都去创建,而是直接获取就好了,而且如果当前这个bean对应的A类要换成B类,也比较方便。
UnitTestBase的子类的写入:
1 @RunWith(BlockJUnit4ClassRunner.class) 2 public class TestOneInterface extends UnitTestBase { 3 4 public TestOneInterface() { 5 super("classpath*:spring-ioc.xml"); 6 } 7 8 @Test 9 public void test() { 10 OneInterface oneIn = super.getBean("oneInterface"); 11 System.out.println(oneIn.hello("my parameters...")); 12 } 13 14 }
以上是关于junit与Spring结合的主要内容,如果未能解决你的问题,请参考以下文章