Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Mock da classe Scanner

Boa noite galera,

Não estou conseguindo mockar a classe Scanner do java.

Como ela é uma classe final estou usando o PowerMock. Ao rodar o teste ele cria uma instância da classe Scanner com as propriedades nulas e não gera o proxy para encapsulá-la.

Segue o código de exemplo da classe e do teste.

public final class Teste {
    private Scanner scanner;

    public Teste(Scanner scanner) {
        this.scanner = scanner;
    }
}
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Scanner.class })
public class ScannerTest {

    @InjectMocks
    private Teste teste;

    @Mock
    private Scanner scanner;

    @Test
    public void shouldStart() throws Exception {
        scanner.hasNext();
    }

}

Muito obrigado.

5 respostas

Opa, você precisa criar as expectativas relacionadas as chamadas dos métodos.. uma vez que você mockou, os métodos não sabem mais o que responder para cada chamada.

Boa tarde Alberto,

Eu havia feito a expectativa, porem o problema é que a classe scanner não está sendo mockada. Nesse exemplo que coloquei (apenas para fins de teste), ao chamar o método, ele nao deveria fazer nada pq está mockado. Correto? Ao invés de criar um mock da classe ele está executando o método real. O @Mock não está criando um mock da classe.

ah, entendi... é, não tenho tanta experiência com o power mock.. já tentou gerar o mock programaticamente, em vez de usar a annotation?

Sim. Nada também. Criei uma classe final para testar e funcionou. Só ocorre esse problema com a Scanner.

solução

O problema é que o PrepareForTest deve ser para a classe que vai ser manipulada, que no caso é a Teste, e não a Scanner.

O seguinte teste funcionou perfeitamente (e deu erro quando gravo a expectativa errada, o que é sempre um bom teste do teste :-) ) :

@RunWith(PowerMockRunner.class) @PrepareForTest({ Teste.class }) public class TesteTest {

@InjectMocks private Teste teste;

@Mock private Scanner scanner;

@Test public void shouldStart() throws Exception { Mockito.when(scanner.hasNext()).thenReturn(true); boolean resultado = scanner.hasNext();

assertThat(resultado, is(true)); }

}