Então, eu estou criando um objeto simulado como uma variável estática no nível da classe ... Assim, em um teste, quero Foo.someMethod()
retornar um determinado valor, enquanto em outro teste, quero que ele retorne um valor diferente. O problema que estou tendo é que parece que preciso reconstruir as zombarias para que isso funcione corretamente. Gostaria de evitar a reconstrução das zombarias e apenas usar os mesmos objetos em cada teste.
class TestClass {
private static Foo mockFoo;
@BeforeClass
public static void setUp() {
mockFoo = mock(Foo.class);
}
@Test
public void test1() {
when(mockFoo.someMethod()).thenReturn(0);
TestObject testObj = new TestObject(mockFoo);
testObj.bar(); // calls mockFoo.someMethod(), receiving 0 as the value
}
@Test
public void test2() {
when(mockFoo.someMethod()).thenReturn(1);
TestObject testObj = new TestObject(mockFoo);
testObj.bar(); // calls mockFoo.someMethod(), STILL receiving 0 as the value, instead of expected 1.
}
}
No segundo teste, ainda estou recebendo 0 como o valor quando testObj.bar () é chamado ... Qual é a melhor maneira de resolver isso? Observe que eu sei que eu poderia usar uma simulação diferente Foo
em cada teste; no entanto, eu tenho que encadear várias solicitações mockFoo
, o que significa que eu teria que fazer o encadeamento em cada teste.
test1
e depoistest2
. Mas pode ser que seu ambiente de integração contínua execute os testes na outra ordem. Ou pode ser que você queira executartest2
sozinho, sem executartest1
primeiro, caso em que falhará. Os testes de unidade devem sempre ser independentes um do outro; e nunca deve haver uma dependência entre testes individuais ou uma ordem específica de testes. ConsiderandothenReturn
declarações de encadeamento ...thenReturn
, não é uma solução correta neste caso específico. Parece-me que as hordas de promotores aqui provavelmente não conseguiram entender a questão.@FixMethodOrder
Para todos que procuram retornar algo e depois para outra chamada, lance a exceção:
ou
fonte
Ou ainda mais limpo:
fonte
Para qualquer pessoa que use o spy () e o doReturn () em vez do método when ():
o que você precisa para retornar objetos diferentes em chamadas diferentes é o seguinte:
.
Para zombarias clássicas:
ou com uma exceção sendo lançada:
fonte