J'ai une classe comme ci-dessous:
public class A {
public A(String test) {
bla bla bla
}
public String check() {
bla bla bla
}
}
La logique dans le constructeur A(String test)
et ce check()
sont les choses que j'essaie de me moquer. Je veux des appels comme: new A($$$any string$$$).check()
renvoie une chaîne factice "test"
.
J'ai essayé:
A a = mock(A.class);
when(a.check()).thenReturn("test");
String test = a.check(); // to this point, everything works. test shows as "tests"
whenNew(A.class).withArguments(Matchers.anyString()).thenReturn(rk);
// also tried:
//whenNew(A.class).withParameterTypes(String.class).withArguments(Matchers.anyString()).thenReturn(rk);
new A("random string").check(); // this doesn't work
Mais cela ne semble pas fonctionner. new A($$$any string$$$).check()
passe toujours par la logique du constructeur au lieu de récupérer l'objet fictif de A
.
Réponses:
Le code que vous avez publié fonctionne pour moi avec la dernière version de Mockito et Powermockito. Peut-être que vous n'avez pas préparé A? Essaye ça:
A.java
public class A { private final String test; public A(String test) { this.test = test; } public String check() { return "checked " + this.test; } }
MockA.java
import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(A.class) public class MockA { @Test public void test_not_mocked() throws Throwable { assertThat(new A("random string").check(), equalTo("checked random string")); } @Test public void test_mocked() throws Throwable { A a = mock(A.class); when(a.check()).thenReturn("test"); PowerMockito.whenNew(A.class).withArguments(Mockito.anyString()).thenReturn(a); assertThat(new A("random string").check(), equalTo("test")); } }
Les deux tests devraient réussir avec mockito 1.9.0, powermockito 1.4.12 et junit 4.8.2
la source
PrepareForTest
À ma connaissance, vous ne pouvez pas vous moquer des constructeurs avec mockito, uniquement des méthodes. Mais selon le wiki sur la page de code Google de Mockito, il existe un moyen de se moquer du comportement du constructeur en créant une méthode dans votre classe qui retourne une nouvelle instance de cette classe. alors vous pouvez simuler cette méthode. Ci-dessous un extrait directement du wiki Mockito :
Si vous souhaitez simplement renvoyer un objet fictif de votre classe, je pense que cela devrait fonctionner pour vous. Dans tous les cas, vous pouvez en savoir plus sur la création d'objets moqueurs ici:
http://code.google.com/p/mockito/wiki/MockingObjectCreation
la source
Sans utiliser Powermock .... Voir l'exemple ci-dessous basé sur la réponse de Ben Glasser car il m'a fallu un certain temps pour le comprendre ... j'espère que cela permet de gagner du temps ...
Classe originale:
public class AClazz { public void updateObject(CClazz cClazzObj) { log.debug("Bundler set."); cClazzObj.setBundler(new BClazz(cClazzObj, 10)); } }
Classe modifiée:
@Slf4j public class AClazz { public void updateObject(CClazz cClazzObj) { log.debug("Bundler set."); cClazzObj.setBundler(getBObject(cClazzObj, 10)); } protected BClazz getBObject(CClazz cClazzObj, int i) { return new BClazz(cClazzObj, 10); } }
Classe d'essai
public class AClazzTest { @InjectMocks @Spy private AClazz aClazzObj; @Mock private CClazz cClazzObj; @Mock private BClazz bClassObj; @Before public void setUp() throws Exception { Mockito.doReturn(bClassObj) .when(aClazzObj) .getBObject(Mockito.eq(cClazzObj), Mockito.anyInt()); } @Test public void testConfigStrategy() { aClazzObj.updateObject(cClazzObj); Mockito.verify(cClazzObj, Mockito.times(1)).setBundler(bClassObj); } }
la source
Avec mockito, vous pouvez utiliser withSettings (), par exemple si le CounterService nécessitait 2 dépendances, vous pouvez les passer comme un simulacre:
UserService userService = Mockito.mock(UserService.class); SearchService searchService = Mockito.mock(SearchService.class); CounterService counterService = Mockito.mock(CounterService.class, withSettings().useConstructor(userService, searchService));
la source
Mockito a des limites pour tester les méthodes finales, statiques et privées.
avec la bibliothèque de test jMockit, vous pouvez faire quelques trucs très faciles et simples comme ci-dessous:
Constructeur fictif d'une classe java.io.File:
new MockUp<File>(){ @Mock public void $init(String pathname){ System.out.println(pathname); // or do whatever you want } };
Simulez une méthode statique:
la source