9
votes

Mockito - Constructeur de classe hérité moqueur

J'écris Junit pour une classe qui fait référence à une classe héritage via constructeur. La classe Legacy est dans un bocal tiers, donc je ne peux donc pas le refroidir pour rendre la vie plus facile ...

C'est la classe testée ... p>

public MyClassTest {

    @Test
    public void testMethodToTest() throws Exception {
        LegacyClass legacyMock = mock(LegacyClass.class);
        when(*the LegacyClass constructor with param is called*).thenReturn(legacyMock);
        *.... etc.....*
    }
}


3 commentaires

Un constructeur qui retourne quelque chose? Es-tu sûr? Pour des fonctions normales, l'encombrement que vous avez suggéré devrait fonctionner.


Lorsque le code "New LegacyClass (param)" est exécuté, je veux que cela retourne une simulacre. De cette façon, je peux tester "MéthodeToTest" sans avoir besoin de construire une classement en direct. La méthode "quand" peut être la méthode Wron de le faire. C'est ma question, comment puis-je le faire ???


HM, c'est plutôt difficile dans ce cas. Si vous n'avez aucune chance de passer dans la classe Legacy (c.-à-d. Méthode de chaîne publiqueToTtest (String Param, LegacyClass LC) ) Ou le créer à l'aide d'une usine que vous pouvez échanger (à l'intérieur de la méthodeTest: lcfactory.create (param) qui crée ensuite une instance, je ne vois pas une façon de tester la méthode, sauf par son comportement extérieur. Ces deux alternatives peuvent également faire une maquette créée par Mockito.


3 Réponses :


9
votes

faire un constructeur pour le LegacyClass : xxx

de cette façon que votre classe peut être testée afin qu'elle crée le Legacyclass avec le paramètre correct. xxx

Le test ressemblera à ceci: xxx

si Si LegacyClass se trouve être final alors vous devez créer une enveloppe non finale pour LegacyClass que myClass utilisera.


0 commentaires

5
votes

Vous pouvez utiliser PowerMockito Framework:

import static org.powermock.api.mockito.PowerMockito.*;

whenNew(LegacyClass.class)
  .withParameterTypes(String.class)
  .withArguments(Matchers.any(String.class))
  .thenReturn(new MockedLegacyClass(param));


0 commentaires

0
votes

Je pense qu'il n'est pas possible de se moquer de constructeurs à l'aide de Mockito. Au lieu de cela, je vais suggérer l'approche suivante:

  public MyClass {

    public String methodToTest(String param) {
     if(legacy== null){
      //when junit runs, you will get mocked object (not null), hence don't initialize 
        LegacyClass legacy = new LegacyClass(param);
      }
        *..... etc ........*
    }
}

public MyClassTest {

@InjectMock
Myclass myclass; // inject mock the real testable class
@Mock
LegacyClass legacy

@Test
public void testMethodToTest() throws Exception {    
    // when(legacy-constructor).thenReturn() ---not Required
    // instead directly mock the required methods using mocked legacy object
    when(legacy.getSomething(Mockito.any(String.class))).thenReturn(null);
        *.... etc.....*
    }
}


0 commentaires