web-dev-qa-db-fra.com

Comment se moquer d'une interface Java PowerMockito

J'essaie de me moquer d'une interface.

public interface FlowCopyParamsBusinessManager {
List<FlowCopyParams> findByAppli(String application, String sourcePattern)
        throws FlowCopyParamsBusinessException;

}

Dans mon code, lorsque j'appelle cette méthode findByAppli , j'aimerais renvoyer une liste de FlowCopyParams.

List<FlowCopyParams> lstFlowCopyParams = flowCopyParamsBusinessManager.findByAppli(
                    "TOTO","TATA);

Voici mon essai au test de classe:

@BeforeClass
public static void mockBeanIn() throws Exception {
List<FlowCopyParams> flowCopyParamsList = new ArrayList<>();

PowerMockito.spy(FlowCopyParamsBusinessManager.class);
PowerMockito.when(FlowCopyParamsBusinessManager.class, "findByAppli",  Mockito.anyString(), Mockito.anyString()).thenReturn(flowCopyParamsList);
}  

J'ai cette erreur:

Java.lang.IllegalArgumentException: object is not an instance of declaring class

Je ne sais pas pourquoi parce que la méthode findByAppli doit avoir deux paramètres de chaîne, et j'ai mis Mockito.anyString () et j'ai toujours IllegalArgumentException .

Un indice?

Thxs.

6
Kikou

Vous n'avez pas besoin d'utiliser PowerMockito, et en tant qu'interface, vous n'avez pas besoin d'espionner () car vous ne vous fiez à aucune logique non simulée.

Cela peut être fait comme ceci, dans votre classe de test définir une variable de classe. 

private FlowCopyParamsBusinessManager flowCopyParamsBusinessManagerMock;

Dans une méthode annotée @Before:

flowCopyParamsBusinessManagerMock = Mockito.mock(FlowCopyParamsBusinessManager.class);
List<FlowCopyParams> flowCopyParamsList = new ArrayList<>();
when(flowCopyParamsBusinessManagerMock 
.findByAppli(Mockito.anyString(), Mockito.anyString()).thenReturn(flowCopyParamsList);

Ensuite, référez-vous à flowCopyParamsBusinessManagerMock dans vos tests.

7
UserF40

Mon test n'a pas fonctionné car j'essayais d'espionner la classe et non sur l'instance de FlowCopyParamsBusinessManager.class.

Tout d'abord, nous devons créer la maquette:

FlowCopyParamsBusinessManager mockFlowCopyParamsBusinessManager = PowerMockito.mock(FlowCopyParamsBusinessManager.class);

Ensuite, observez l'instance:

PowerMockito.spy(mockFlowCopyParamsBusinessManager);
PowerMockito.when(mockFlowCopyParamsBusinessManager, "findByAppli", Mockito.anyString(), Mockito.anyString()).thenReturn(flowCopyParamsList);

Cela fonctionne aussi bien!

1
Kikou

C'est ce que j'ai fait pour placer @RunWith (PowerMockRunner.class) en haut de la classe. puis mock Object avec PowerMockito.mock (MyMock.class); De cette façon, l'utilisation peut se moquer d'une interface ou d'un cours final.

0
abhishek ringsia