Pergunta

Às vezes, você quer testar um método de classe e você quer fazer uma expectativa em uma chamada de um método de classe super. Eu não encontrei uma maneira de fazer essa expectativa em java usando EasyMock ou jMock (e eu acho que não é possível).

Há uma solução limpa (relativa), para criar um delegado com a lógica de super método de classe e, em seguida, definir as expectativas sobre ele, mas eu não sei por que e quando o uso dessa solução ¿todas as idéias / exemplos?

Graças

Foi útil?

Solução

Bem, você pode, se você quiser. Eu não sei se você está familiarizado com JMockit , ir dar uma olhada. A versão atual é 0.999.17 Nesse meio tempo, vamos dar uma olhada nisso ...

Suponha que a seguinte hierarquia de classes:

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()");
    }
}

Em seguida, usando JMockit em sua FooTest.java você pode validar que você está realmente fazendo uma chamada para Bar de Foo.

@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();
}

Outras dicas

Expandindo resposta @Cem Catikkas, usando 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);
}

Não há necessidade para a classe estática anotado com @MockClass, ele é substituído pela classe maquete.

Eu não acho que eu zombar uma chamada de super - parece-me que o comportamento não faz parte do comportamento da própria classe, ao invés do comportamento de uma dependência. Zombando sempre se sente como deve ser a ver com dependências mais do que qualquer outra coisa.

Você tem um bom exemplo do tipo de chamada que deseja zombar fora? Se você quer zombar de uma chamada como este, seria vale a pena considerar a composição em vez de herança?

Existem vários testes que fazem exatamente isso (ou seja, especificar uma invocação esperado em um método de super-classe) utilizando a API Expectativas JMockit, na suíte de teste de amostra Animated Transitions. Por exemplo, o FadeInTest caso de teste.

Não, não há nenhuma maneira de zombar métodos de classe super com jMock .

No entanto, há uma solução rápida e suja para o seu problema. Suponha que você tem classe A e classe B estende A. Você quer Aa método de simulação () no B. Você pode introduzir classe C estende B em seu código de teste e substituir o método Ca () (apenas chamar super, ou return null, id não importa). Depois disso simulada C e usar o mock em todos os lugares, aonde você deve usar B.

interceptar uma chamada super é demais de grão fino. Não exagere no isolamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top