2017-06-30 3 views
1

J'essaie de simuler un champ privé dans ma classe qui est initialisé par un conteneur OSGI dans lequel mon application est en cours d'exécution. Je mets un exemple de code pour référence, aucun indice sur ce s'il vous plaît:Champ privé fictif initialisé par le conteneur OSGI Felix

import org.apache.felix.scr.annotations.* 
@Component (name = "MyServiceImpl ", ds = true, immediate = true) 
@Service 
public class MyServiceImpl extends MyBasee implements MyService { 

    @Reference (name = "MyOtherService", bind = "bind", unbind = "unbind", policy = ReferencePolicy.STATIC) 
    private MyOtherService myServiceRegistryConsumer; 
} 

Ici, je suis en train de se moquer de champ privé MyOtherService myServiceRegistryConsumer

Répondre

2

Avec Mockito vous pouvez railler et injecter des champs à l'aide de l'annotation @InjectMocks.

@RunWith(MockitoJUnitRunner.class) 
public class AppTest { 

    @Mock 
    private MyOtherService myServiceRegistryConsumer; 

    @InjectMocks 
    private MyServiceImpl myServiceImpl; 

    @Test 
    public void testSomething() { 
     // e.g. define behavior for the injected field 
     when(myServiceRegistryConsumer.methodA()).thenReturn(/* mocked return value */); 
    } 
} 
+0

J'ai édité ma question pour plus de clarté. De cette façon, je n'aurai aucun contrôle sur le domaine privé myServiceRegistryConsumer. Je ne veux pas injecter/simuler MyServiceImpl mais MyOtherService, qui est instancié par conteneur. – Arun

+0

@Arun 'myServiceImpl' n'est pas un simulacre ici. Mockito se moque seulement de 'myServiceRegistryConsumer' et l'injecte dans l'instance. Dans une méthode de test, vous avez toujours un contrôle total sur le simulacre et vous pouvez définir un comportement pour celui-ci. –

+0

Oui, en travaillant exactement comme vous l'avez expliqué. Merci beaucoup :) – Arun