2016-08-21 1 views
-1

J'ai lu plusieurs tutoriels et manuels, mais tous ignorent la partie dont j'ai réellement besoin, c'est-à-dire la partie où vous exécutez la tâche.Utilisation d'AssistedInject dans les tests

Mon scénario est le suivant.

J'ai une interface Connection:

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

J'ai une mise en œuvre de la production qui a besoin d'un SocketFactory:

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

Je créé un ConnectionFactory:

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

Maintenant, je avoir deux implémentations de SocketFactory: SocketFactoryProd et SocketFactoryTest.

Je crée un test pour Connection et je veux créer un ConnectionImpl avec SocketFactoryTest, et je ne comprends vraiment pas comment je fais exactement. C'est la partie que je continue à manquer, ce que je devrais écrire dans mon test (ou dans la classe de test setUp).

+1

Quelle classe essayez-vous de tester à l'unité? Pourriez-vous s'il vous plaît poster la version préliminaire de l'unité-test? –

+0

@SergeyBrunov Il n'a pas dit que c'était un test unitaire. C'est probablement un test fonctionnel ou d'intégration, où il essaie de lier un autre réseau. – Gene

+0

J'essaie de tester Connection, mais je voudrais utiliser un connectionFactory pour créer la connexion que j'essaie de tester et @injecter. Donc j'essaie de comprendre ce que je devrais écrire (et où) le code qui dit à connectionsFactory (qui est un membre dans la classe de test) que le SocketFactory à utiliser est le SocketFactoryTest.class – slashms

Répondre

0

Vous choisissez quoi être lié à votre interface dans le module Guice:

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); 
    } 
} 

Si vous souhaitez remplacer une liaison existante du SocketFactory un de vos modules de production, vous pouvez le faire:

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

Je pense qu'il manque le point. Je m'attendrais à @Inject the ConnectionsFactory et pas de connexion. Et c'est ce qui me manque. – slashms

+0

Ah oui, excuses, j'ai écrit ceci hâtivement. Vous devez injecter le ConnectionsFactory pas la connexion. Fixé. – JadN