2016-08-21 36 views
-1

我阅读了几个教程和手册,但它们都跳过了我实际需要的部分,这是您运行这些东西的实际部分。在测试中使用AssistedInject

我的场景如下。

我有一个Connection接口:

public interface Connection { 
    void open(Selector selector); 
    void send(NetMessage message); 
} 

我有一个生产的实现,需要一个SocketFactory

public class ConnectionImpl implements Connection { 
    // members 
    @Inject 
    public ConnectionImpl(@Assisted SecurityMode securityMode, @Assisted long connectionId, 
          @Assisted EntityAddresses addresses, SocketFactory socketFactory) 

所以我创建了一个ConnectionFactory

public interface ConnectionFactory { 
    SioConnection create(SecurityMode securityMode, long connectionId, EntityAddresses addresses); 
} 

现在,我有两个实现SocketFactorySocketFactoryProdSocketFactoryTest

我正在为Connection创建一个测试,我想创建一个ConnectionImplSocketFactoryTest,我真的不明白我是如何做到的。这是我不断失踪的部分,我应该在我的测试中写下(或在测试类setUp)。

+1

你想要单元测试哪一个类?你能否发表单元测试的草稿版本? –

+0

@SergeyBrunov他没有说这是一个单元测试。这可能是一个功能或集成测试,他试图绑定一个备用网络。 – Gene

+0

我想测试连接,但我想使用一个connectionFactory来创建连接,我尝试测试和@注入它。所以我想了解我应该写什么(以及在哪里)告诉connectionFactory(它是测试类中的成员)使用SocketFactory的代码是SocketFactoryTest.class – slashms

回答

0

您选择在吉斯模块绑定到你的接口是什么:

public class MyTest { 

    @Inject 
    private ConnectionFactory connectionFactory; 

    @Before 
    public void setUp() { 
     Injector injector = Guice.createInjector(
       <your modules here>, 
       new AbstractModule() { 
        @Override 
        protected void configure() { 
         install(new FactoryModuleBuilder() 
           .implement(Connection.class, ConnectionImpl.class) 
           .build(ConnectionFactory.class)); 
         bind(SocketFactory.class).to(SocketFactoryTest.class); 
        } 
       } 
     ); 
     injector.injectMembers(this); 
    } 
} 

如果你想从您的生产模块中的一个重写的SocketFactory的现有绑定,你可以这样做:

public class MyTest { 

    @Inject 
    private ConnectionFactory connectionFactory; 

    @Before 
    public void setUp() { 
     Injector injector = Guice.createInjector(
       Modules.override(
        <your modules here. Somewhere the 
        FactoryModuleBuilder is installed here too> 
       ).with(
        new AbstractModule() { 
         @Override 
         protected void configure() { 
          bind(SocketFactory.class).to(SocketFactoryTest.class); 
         } 
        } 
       ) 
     ); 
     injector.injectMembers(this); 
    } 
} 
+0

我觉得它缺少重点。我期望@注入ConnectionsFactory而不是连接。这就是我想念的。 – slashms

+0

啊,是的,道歉,我急急地写了这个。您应该注入ConnectionsFactory而不是Connection。固定。 – JadN