Donc, je crée un objet simulé en tant que variable statique au niveau de la classe comme ça ... Dans un test, je veux Foo.someMethod()
retourner une certaine valeur, tandis que dans un autre test, je veux qu'il retourne une valeur différente. Le problème que j'ai, c'est qu'il semble que je dois reconstruire les maquettes pour que cela fonctionne correctement. Je voudrais éviter de reconstruire les maquettes et utiliser simplement les mêmes objets dans chaque test.
class TestClass {
private static Foo mockFoo;
@BeforeClass
public static void setUp() {
mockFoo = mock(Foo.class);
}
@Test
public void test1() {
when(mockFoo.someMethod()).thenReturn(0);
TestObject testObj = new TestObject(mockFoo);
testObj.bar(); // calls mockFoo.someMethod(), receiving 0 as the value
}
@Test
public void test2() {
when(mockFoo.someMethod()).thenReturn(1);
TestObject testObj = new TestObject(mockFoo);
testObj.bar(); // calls mockFoo.someMethod(), STILL receiving 0 as the value, instead of expected 1.
}
}
Dans le deuxième test, je reçois toujours 0 comme valeur lorsque testObj.bar () est appelé ... Quelle est la meilleure façon de résoudre ce problème? Notez que je sais que je pourrais utiliser une maquette différente de Foo
dans chaque test, cependant, je dois chaîner plusieurs demandes mockFoo
, ce qui signifie que je devrais faire le chaînage dans chaque test.
test1
puistest2
. Mais il se peut que votre environnement d'intégration continue exécute les tests dans l'autre ordre. Ou il se peut que vous souhaitiez exécutertest2
lui-même, sans exécuter entest1
premier, auquel cas il échouera. Les tests unitaires doivent toujours être indépendants les uns des autres; et il ne devrait jamais y avoir de dépendance entre les tests individuels, ou une dépendance sur un ordre particulier de tests. Alors que l'enchaînement desthenReturn
déclarations ...thenReturn
, ce n'est pas une solution correcte dans ce cas particulier. Il me semble que les hordes d'électeurs ici ont très probablement échoué à comprendre la question.@FixMethodOrder
Pour tous ceux qui cherchent à renvoyer quelque chose, puis une autre exception de levée d'appel:
ou
la source
Ou, encore plus propre:
la source
Pour toute personne utilisant spy () et doReturn () au lieu de la méthode when ():
ce dont vous avez besoin pour retourner un objet différent sur différents appels est le suivant:
.
Pour les simulacres classiques:
ou avec une exception levée:
la source