Pergunta

Atualmente, estou usando o Mockito para zombar dos objetos da camada de serviço em um aplicativo MVC de primavera no qual quero testar meus métodos de controlador. No entanto, como tenho lido sobre os detalhes do Mockito, descobri que os métodos doReturn(...).when(...) é equivalente a when(...).thenReturn(...). Então, minha pergunta é qual é o sentido de ter dois métodos que fazem a mesma coisa ou qual é a diferença sutil entre doReturn(...).when(...) e when(...).thenReturn(...)?

Qualquer ajuda seria apreciada.

Foi útil?

Solução

As duas sintaxes para a malha são aproximadamente equivalentes. No entanto, você pode sempre usar doReturn/when para morrer; Mas há casos em que você não pode usar when/thenReturn. Métodos de vazio de stubbing é um desses. Outros incluem uso com espiões do Mockito e arrancando o mesmo método mais de uma vez.

Uma coisa que when/thenReturn dá a você que doReturn/when Não, não é a verificação do tipo do valor que você está retornando, no momento da compilação. No entanto, acredito que isso quase não tem valor - se você tem o tipo errado, você descobrirá assim que executar seu teste.

Eu recomendo fortemente apenas usar doReturn/when. Não faz sentido aprender duas sintaxes quando alguém o fará.

Você pode querer se referir à minha resposta em Formando Mockito "Grammais" - Uma resposta mais detalhada para uma pergunta muito intimamente relacionada.

Outras dicas

Ambas as abordagens se comportam de maneira diferente se você usar um objeto espião (anotado com @Spy) em vez de uma simulação (anotada com @Mock):

  • when(...) thenReturn(...) faz uma chamada de método real pouco antes do valor especificado ser retornado. Portanto, se o método chamado lança uma exceção, você deve lidar com ele / zombar etc. É claro que você ainda obtém seu resultado (o que você define em thenReturn(...))

  • doReturn(...) when(...) não chama o método.

Exemplo:

public class MyClass {
     protected String methodToBeTested() {
           return anotherMethodInClass();
     }

     protected String anotherMethodInClass() {
          throw new NullPointerException();
     }
}

Teste:

@Spy
private MyClass myClass;

// ...

// would work fine
doReturn("test").when(myClass).anotherMethodInClass();

// would throw a NullPointerException
when(myClass.anotherMethodInClass()).thenReturn("test");

O Mockito Javadoc parece dizer por que usar doReturn() ao invés de when()Use DORETURN () NESSE RAROS OCASIONS quando você não pode usar o Mockito.When (objeto).

Cuidado com o que o Mockito.Hhen (Object) é sempre recomendado para mortir, porque é um tipo de argumento seguro e mais legível (especialmente quando fortalece as chamadas consecutivas).

Aqui estão essas raras ocasiões em que o DORETURN () é útil:

1. Ao espionar objetos reais e chamar métodos reais em um espião traz efeitos colaterais

List list = new LinkedList(); List spy = spy(list);

// impossível: o método real é chamado So Spy.get (0) lança indexOutOfBoundSexception (a lista ainda está vazia)

when(spy.get(0)).thenReturn("foo");

// Você precisa usar o DORETURN () para Stubbing: doReturn("foo").when(spy).get(0);

2. Substituindo uma exceção anterior:

when(mock.foo()).thenThrow(new RuntimeException());

// Impossível: o método foo () excepcionada é chamado de So RunTimeException é jogado. when(mock.foo()).thenReturn("bar");

// Você precisa usar o DORETURN () para Stubbing:

doReturn("bar").when(mock).foo(); Os cenários acima mostram uma troca da sintaxe elegante da Mockito. Observe que os cenários são muito raros, no entanto. A espionagem deve ser esporádica e a excepção de exceção é muito rara. Sem mencionar que, em geral, supere a estuba é um cheiro de código em potencial que aponta muita coisa.

Continuando esta resposta, Há outra diferença de que, se você deseja que seu método retorne valores diferentes, por exemplo, quando é chamado pela primeira vez, segunda vez, etc., você pode passar valores, por exemplo ...

PowerMockito.doReturn(false, false, true).when(SomeClass.class, "SomeMethod", Matchers.any(SomeClass.class));

Portanto, ele retornará false quando o método for chamado no mesmo caso de teste e, em seguida, retornará False novamente e, por fim, verdadeiro.

A última alternativa é usada para métodos em zombarias que retornam void.

Por favor, dê uma olhada, por exemplo, aqui:Como fazer mock to anular métodos com mockito

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