gienah-testing

时间:2022-11-22 09:58:05


SpringRunner

   

   地址:​​http://code.google.com/p/gienah-testing/​​​
    gienah-testing项目主要包含2个Junit4的运行类: springrunner和springtransactionalrunner 。springrunner负责访问主要项目特性的引擎:bean注入。Springtransactionalrunner继承于springrunner ,允许有标记的事务测试在测试完成时将回滚到测试发生前。
     使用这些类,你需要在您的测试类中标记JUnit 4的@ runwith。此外,您必须使用gienah-testing的@Configuration标记来指定Spring的配置文件。看看下面的例子:


Java代码 ​



1. @RunWith(value = SpringRunner.class)   
2. @Configuration(locations = {"resources/spring/spring-beans.xml"})
3. public class
4.
5. @Test public void
6. ...
7. }
8.
9. ...
10. }

@RunWith(value = SpringRunner.class)
@Configuration(locations = {"resources/spring/spring-beans.xml"})
public class TestUserService {

@Test public void someTestMethod() {
...
}

...
}

    我们现在为业务类写一个测试类,请留意@Configuration标记,你可以使用locations属性来指定spring配置文件的路径,将会获取到spring的上下文.还可以以其它方式来使用@Configuration标记, 但这些将经过审查后再补上。
现在,将通过配置运行类来获取变量,请留意下面的例子:


Java代码 ​​​


1. @RunWith(value = SpringRunner.class)   
2. @Configuration(locations = {"resources/spring/spring-beans.xml"})
3. public class
4.
5. @Dependency
6. private
7.
8. @Test
9. public void
10. this.someBean);
11. }
12.
13. }


@RunWith(value = SpringRunner.class)
@Configuration(locations = {"resources/spring/spring-beans.xml"})
public class TestUserService {

@Dependency
private SomeBean someBean;

@Test
public void someTestMethod() {
Assert.assertNotNull(this.someBean);
}

}

使用@Dependency标记可以使我们有效地使配置文件中bean的”somebean”注入到我们的测试类中,因此字段将会以实例的方式出现在我们的代码中,那么,运行类将查找spring上下文中相对应的指定的bean名称的bean,如果你想装载一个bean使用不同的名称,你可以利用@Dependency标记来为它指定”bean”属性.
    另外介绍的特性就是允许使用测试标记在测试完成后使事务自动回滚到测试前。例如,下面的示例:


Java代码 ​​​



    1. @RunWith(value = SpringRunner.class)   
    2. @Configuration(locations = {"resources/spring/spring-beans.xml"})
    3. public class
    4. @Test
    5. @Transactional
    6. public void
    7. // doing some database stuff here...
    8. }
    9. @Test
    10. public void
    11. // doing some database stuff here...
    12. }
    13. }

    @RunWith(value = SpringRunner.class)
    @Configuration(locations = {"resources/spring/spring-beans.xml"})
    public class TestUserService {
    @Test
    @Transactional
    public void someTestMethod() {
    // doing some database stuff here...
    }
    @Test
    public void someOtherTestMethod() {
    // doing some database stuff here...
    }
    }

        "someTestMethod"方法以事务的方式执行,而"someOtherTestMethod"方法则不会。当"someTestMethod"方法执行完后,事务将使数据库状态回滚到未执行前,你也可以使全部测试类都标记@Transactional属性,所有的测试方法都将在事务中执行

    配置spring上下文
    在前面的话题中,你在执行中见到@Configuration标记。这个标记有三个属性:locations, provider和loader,下面让我们看看如何去使用它们:
       •locations(可选择):使用这个属性你可以使用指定的spring配置文件来生成spring上下文
        •provider(可选择):使用这个属性允许你指定一个类同样可以使用@Configuration标记去指定locations的属性,这里允许一个特许的locations说明在一个测试类套件中
        •loader(可选择):这个属性允许你去指定IcontextLoader的实现并去使用它构成spring上下文.一般情况使用默认配置已经足够.

        @Configuration标记至少指定locations或者provider其中一个属性,如果没有它们其中的一个,将会使JUnit 4显示出一个error.让我们去看看提供的属性在执行中的实例:


    Java代码 ​​​



      1. @RunWith(value = SpringRunner.class)   
      2. @Configuration(locations = {"resources/spring/spring-beans.xml"})
      3. public class
      4. ...
      5.
      6. }
      7. @RunWith(value = SpringRunner.class)
      8. @Configuration(provider = Test1.class)
      9. public class
      10. ...
      11. }
      12. @RunWith(value = SpringRunner.class)
      13. @Configuration(provider = Test2.class)
      14. public class
      15. ...
      16. }

      @RunWith(value = SpringRunner.class)
      @Configuration(locations = {"resources/spring/spring-beans.xml"})
      public class Test1 {
      ...

      }
      @RunWith(value = SpringRunner.class)
      @Configuration(provider = Test1.class)
      public class Test2 {
      ...
      }
      @RunWith(value = SpringRunner.class)
      @Configuration(provider = Test2.class)
      public class Test3 {
      ...
      }
      @RunWith(value = SpringRunner.class)
      @Configuration(locations = {"resources/spring/spring-beans.xml"})
      public class Test1 {
      ...

      }
      @RunWith(value = SpringRunner.class)
      @Configuration(provider = Test1.class)
      public class Test2 {
      ...
      }
      @RunWith(value = SpringRunner.class)
      @Configuration(provider = Test2.class)
      public class Test3 {
      ...
      }

          注意怎样去构造est3从Test2到Test1经过的流程.这个方式(通过路径获取获取配置)是不平常和不受欢迎的,但我想说明一下这个表现.

      访问spring上下文
      最后,也可以直接获取spring上下文,如果这样,你应该在你的测试中创建一个局部变量和写上一个@Context标记:


      Java代码 ​​​


      1. @RunWith(value = SpringRunner.class)   
      2. @Configuration(locations = {"resources/spring/spring-beans.xml"})
      3. public class
      4. @Context
      5. private
      6. @Test
      7. public void
      8. "someBean");
      9. ...
      10. }
      11. }

      @RunWith(value = SpringRunner.class)
      @Configuration(locations = {"resources/spring/spring-beans.xml"})
      public class TestUserService {
      @Context
      private ConfigurableApplicationContext context;
      @Test
      public void someTestMethod() {
      SomeBean someBean = context.getBean("someBean");
      ...
      }
      }

      当这样做时,运行类将可以使spring上下文将会自动地注入到你的测试类中,然后你也可以访问它.

      配置文件解释
      EO.2版本改变了单元测试类的配置,以springXML配置文件的方式填写.因此, 该项目引进一个新的标签:gienah.
      在gienah架构下使用标签,你必须在你的springXML配置文件的头部导入声明,
      The emboldened text in the XML sample below represents the additions you must add to get access to the tags contained in the gienah namespaces.


      Xml代码 ​​​


      1. <?xml version="1.0" encoding="UTF-8"?>
      2. <beans
      3. xmlns="http://www.springframework.org/schema/beans"
      4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      5. xmlns:gienah="http://www.springframework.org/schema/gienah"
      6. xsi:schemaLocation="
      7. ​​ http://www.springframework.org/schema/beans ​​
      8. ​​ http://www.springframework.org/schema/beans/spring-beans-2.0.xsd ​​
      9. ​​ http://www.springframework.org/schema/gienah ​​
      10. >
      11. ...
      12. </beans>
      13.
      14. <gienah:test />


      <?xml version="1.0" encoding="UTF-8"?>
      <beans
      xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:gienah="http://www.springframework.org/schema/gienah"
      xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
      http://www.springframework.org/schema/gienah
      http://www.springframework.org/schema/gienah/gienah.xsd">
      ...
      </beans>

      <gienah:test />


      标签
      这个标签在springXML配置文件中定义一个测试类,看下面的例子去了解通常的情况:


      Xml代码 ​​​



      1. <gienah:test class="org.myproject.test.TestSample1" transactional="true">
      2. <gienah:dependency property="someBean1" bean="someBean" />
      3. <gienah:context property="applicationContext" />
      4. <gienah:method name="testSomething" transactional="true" ignore="false" />
      5. </gienah:test>


      <gienah:test class="org.myproject.test.TestSample1" transactional="true">
      <gienah:dependency property="someBean1" bean="someBean" />
      <gienah:context property="applicationContext" />
      <gienah:method name="testSomething" transactional="true" ignore="false" />
      </gienah:test>


      This approach is equals to mark the someBean1 class attribute with the @Dependency annotation. Latest, using the <gienah:context /> tag you can inject the application context to the Test class.

         上述实例在配置文件中把一个测试类命名为TestSample1,它指定了在"testSomething"方法中将支持事务,而其它方法即不运行在同一个事务中(查看主事务属性和<gienah:method />标签),另一个有趣的事情是使用<gienah:dependency />可以定义要注入的bean,这样基本上等同于使用@Dependency标记来标注someBean1类属性,最后,使用<gienah:context />标签你可以在测试类中注入应用上下文

      相关文章