Teste de Mockito, um método nulo gera uma exceção

399

Eu tenho um método com um voidtipo de retorno. Também pode gerar uma série de exceções, então eu gostaria de testar essas exceções sendo lançadas. Todas as tentativas falharam pelo mesmo motivo:

O método quando (T) no tipo Stubber não é aplicável aos argumentos (nulo)

Alguma idéia de como posso obter o método para lançar uma exceção especificada?

doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));
edwardmlyte
fonte

Respostas:

706

Os parênteses estão mal colocados. Você deve usar

doThrow(new Exception()).when(mockedObject).methodReturningVoid(...);
                                          ^

e não

doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));
                                                                   ^

Isso é explicado na documentação

JB Nizet
fonte
7
@edwardmlyte Esta inconsistência Mockito é uma das razões pelas quais eu interruptor tem que MoxieMocks
Muel
Os dois elementos @ podem ser usados: docs.mockito.googlecode.com/hg/latest/org/mockito/… . Criar uma exceção não a lança.
JB Nizet
11
@ JB Nizet Concordo totalmente com você, mas, se eu escrever doThrow (new Exception ()) em vez de doThrow (Exception.class), tenho o seguinte erro ao iniciar meu teste; Exceção esperada com.company.project.exception.ElementNotFoundException, mas obteve org.mockito.exceptions.base.MockitoException:
clement
2
Faça outra pergunta, com o código em teste, o código do teste e o rastreamento completo da pilha da exceção.
JB Nizet
6
doThrow (new Exception ()). when (object) .voidMethod (any ());
Soumyajit Swain
14

Se você já se perguntou como fazê-lo usando o novo estilo BDD do Mockito:

willThrow(new Exception()).given(mockedObject).methodReturningVoid(...));

E para referência futura, pode ser necessário lançar uma exceção e depois não fazer nada:

willThrow(new Exception()).willNothing().given(mockedObject).methodReturningVoid(...));
Ondrej Burkert
fonte
11
Obrigado por postar isso aqui; se o método retornar um valor: dado (mockedObject.methodReturningAnObject ()). willThrow (new Exception ()); se o método não retornar nada: willThrow (new Exception ()). given (mockedObject) .methodReturningVoid (...)); Formulário de explicação javadoc: "A remoção de espaços vazios requer uma abordagem diferente de {@link Mockito # when (Object)} (ou BDDMockito.given) porque o compilador não gosta de métodos vazios entre colchetes ..."
Wolf359