Guice 注入与TestNG结合

本文介绍Guice作为依赖注入框架如何与TestNG集成使用,简化测试代码并降低工程代码和测试代码之间的耦合性。通过配置Maven依赖、创建抽象类及具体类,演示了如何利用Guice进行对象实例化。

前言
Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC)。Guice非常小而且快。Guice是类型安全的,它能够对构造函数,属性,方法(包含任意个参数的任意方法,而不仅仅是setter方法)进行注入。Guice采用Java加注解的方式进行托管对象的配置,充分利用IDE编译器的类型安全检查功能和自动重构功能,使得配置的更改也是类型安全的。Guice提供模块对应的抽象module,使得架构和设计的模块概念产物与代码中的module类一一对应,更加便利的组织和梳理模块依赖关系,利于整体应用内部的依赖关系维护,而其他IOC框架是没有对应物的。此外,借助privateModule的功能,可以实现模块接口的明确导出和实现封装,使得支持多数据源这类需求实现起来异常简单

工程说明:
通过对象工厂(IObjectFactory)和模块(AbstractModule)结合使Guice注入在TestNG使用更加方便简洁
该方法调用injector相当方便,只需要加上注解@Inject就可以实现对象实例化

环境:
IDEA 、Maven
所需jar包
guice.jar

集成使用意义:
减少工程代码和测试代码的耦合性,让测试代码更加简洁

工程搭建:
1)配置Maven的pom.xml文件添加依赖包

<dependency>
    <groupId>com.google.inject</groupId>
    <artifactId>guice</artifactId>
    <version>3.0</version>
</dependency>

2)创建一个抽象类,继承AbstractModule类和接口IobjectFactory

public abstract class GuiceInjectFactory extends AbstractModule implements IObjectFactory {

    public ObjectFactoryImpl creator = new ObjectFactoryImpl();
    private Injector injector;
    public GuiceInjectFactory(){
        injector = Guice.createInjector(this);
    }

    @Override
    public Object newInstance(Constructor constructor, Object... params) {
        Object o = creator.newInstance(constructor,params);
        System.out.println("create test :"+o);
        injector.injectMembers(o);
        return o;
    }
}

3)创建一个类继承上面的抽象类

public class UserAppFactory extends GuiceInjectFactory {
    @Override
    protected void configure() {
//绑定实例对象
        bind(HelloClass.class).toInstance(new HelloClass());//使用后面的类
//绑定类
//bind(HelloClass.class).to(HelloClass.class);
        //bind绑定需要注入
    }
}

4)testNG.xml suite套件添加属性object-factory

<suite name="testproj" parallel="false" object-factory="com.proj.Guice.UserAppFactory">
……
……
</suite>

使用例子

工程代码例子

public class HelloClass {

    public void sayHello(){
        System.out.println("hello world!");
    }
}

测试代码使用例子,使用注解@Inject

public class TestHello {

    @Inject
    HelloClass helloClass;

    @Test
    public void testHello(){
        helloClass.sayHello();
    }

}

发现

会发现上面只需要使用注解@Inject
HelloClass 不需要实例化,Guice自动会进行这些工作,减少了工程代码和测试代码的耦合性

Acai 是 JUnit4 Guice 的测试库,可以更容易的编写应用功能测试。主要特性:注入测试需要的助手类启动测试需要的任意的服务 运行测试之间的服务清理按照正确顺序启动多个服务 创建测试作用域绑定Acai 主要针对的是应用大型功能测试。安装<dependency>   <groupId>com.google.acai</groupId>   <artifactId>acai</artifactId>   <version>0.1</version>   <scope>test</scope> </dependency>使用 Acai 进行测试注入@RunWith(JUnit4.class) public class SimpleTest {   @Rule public Acai acai = new Acai(MyTestModule.class);   @Inject private MyClass foo;   @Test   public void checkSomethingWorks() {     // Use the injected value of foo here   }   private static class MyTestModule extends AbstractModule {     @Override protected void configure() {       bind(MyClass.class).to(MyClassImpl.class);     }   } }使用 Acai 启动服务@RunWith(JUnit4.class) public class ExampleFunctionalTest {   @Rule public Acai acai = new Acai(MyTestModule.class);   @Inject private MyServerClient serverClient;   @Test   public void checkSomethingWorks() {     // Call the running server and test some behaviour here.     // Any state will be cleared by MyFakeDatabaseWiper after each     // test case.   }   private static class MyTestModule extends AbstractModule {     @Override protected void configure() {       // Normal Guice modules which configure your       // server with in-memory versions of backends.       install(MyServerModule());       install(MyFakeDatabaseModule());       install(new TestingServiceModule() {         @Override protected void configureTestingServices() {           bindTestingService(MyServerRunner.class);           bindTestingService(MyFakeDatabaseWiper.class);         }       });     }   }   private static class MyServerRunner implements TestingService {     @Inject private MyServer myServer;     @BeforeSuite void startServer() {       myServer.start().awaitStarted();     }   }   private static class MyFakeDatabaseWiper implements TestingService {     @Inject private MyFakeDatabse myFakeDatabase;     @AfterTest void wipeDatabase() {       myFakeDatabase.wipe();     }   } } 标签:Acai
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值