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 Réponses :
faire un constructeur de cette façon que votre classe peut être testée afin qu'elle crée le Le test ressemblera à ceci: p> si LegacyClass code>:
Legacyclass code> avec le paramètre correct. p>
Si
LegacyClass code> se trouve être
final code> alors vous devez créer une enveloppe non finale pour
LegacyClass code> que
myClass code> utilisera. P> p>
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));
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.....* } }
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) code>) Ou le créer à l'aide d'une usine que vous pouvez échanger (à l'intérieur de la méthodeTest:
lcfactory.create (param) code> 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.