Question

Parfois, vous souhaitez tester une méthode de classe et effectuer une attente sur un appel d'une méthode de super classe. Je n'ai pas trouvé le moyen de faire cette attente en Java en utilisant easymock ou jmock (et je pense que ce n'est pas possible).

Il existe une solution propre (relative), qui consiste à créer un délégué avec la logique de la méthode super-classe, puis à définir les attentes, mais je ne sais pas pourquoi ni quand utiliser cette solution, des idées ou des exemples?

Merci

Était-ce utile?

La solution

Eh bien, vous le pouvez si vous le souhaitez. Je ne sais pas si vous connaissez JMockit , allez le vérifier. La version actuelle est la 0.999.17 En attendant, jetons-y un coup d'œil ...

Supposons la hiérarchie de classes suivante:

public class Bar {
    public void bar() {
        System.out.println("Bar#bar()");
    }
}

public class Foo extends Bar {
    public void bar() {
        super.bar();
        System.out.println("Foo#bar()");
    }
}

Ensuite, en utilisant JMockit dans votre FooTest.java , vous pouvez valider que vous appelez Bar à partir de Foo . / p>

@MockClass(realClass = Bar.class)
public static class MockBar {
    private boolean barCalled = false;

    @Mock
    public void bar() {
        this.barCalled = true;
        System.out.println("mocked bar");
    }
}

@Test
public void barShouldCallSuperBar() {
    MockBar mockBar = new MockBar();
    Mockit.setUpMock(Bar.class, mockBar);

    Foo foo = new Foo();
    foo.bar();

    Assert.assertTrue(mockBar.barCalled);

    Mockit.tearDownMocks();
}

Autres conseils

Développement de la réponse @Cem Catikkas à l'aide de JMockit 1.22:

@Test
public void barShouldCallSuperBar() {
    new MockUp<Bar>() {
        @Mock
        public void bar() {
            barCalled = true;
            System.out.println("mocked bar");
        }
    };

    Foo foo = new Foo();
    foo.bar();

    Assert.assertTrue(mockBar.barCalled);
}

Plus besoin de la classe statique annotée avec @MockClass, elle est remplacée par la classe MockUp.

Je ne pense pas que je me moquerais d'un super appel. Je pense que le comportement fait partie du comportement de la classe elle-même, plutôt que du comportement d'une dépendance. On se moque toujours plus de ce qu’il faut faire avec les dépendances.

Avez-vous un bon exemple du type d’appel que vous voulez vous moquer? Si vous voulez simuler un appel de ce type, vaut-il la peine d’envisager la composition plutôt que l’héritage?

Plusieurs tests le font exactement (c.-à-d. spécifient un appel attendu sur une méthode de super-classe) à l'aide de l'API JMockit Expectations, dans la suite de tests exemples de transitions animées. Par exemple, scénario de test FadeInTest .

Non, vous ne pouvez pas vous moquer des méthodes de super classe avec jMock .

Cependant, il existe une solution rapide à votre problème. Supposons que vous ayez la classe A et que la classe B étend la classe A. Vous voulez simuler la méthode Aa () sur la classe B. Vous pouvez introduire la classe C étend la classe B dans votre code de test et remplacer la méthode Ca () (il suffit d'appeler super ou de renvoyer null, id n'a pas d'importance). Après cela, simulez C et utilisez-le partout où vous utiliseriez B.

intercepter un super appel est beaucoup trop fin. N'abusez pas de l'isolement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top