Итак, я создаю фиктивный объект как статическую переменную на уровне класса следующим образом ... В одном тесте я хочу Foo.someMethod()
вернуть определенное значение, а в другом тесте я хочу, чтобы он возвращал другое значение. Проблема в том, что мне кажется, что мне нужно перестроить макеты, чтобы заставить это работать правильно. Я хотел бы избежать перестройки макетов и просто использовать одни и те же объекты в каждом тесте.
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.
}
}
Во втором тесте я все еще получаю 0 в качестве значения при вызове testObj.bar () ... Каков наилучший способ решить эту проблему? Обратите внимание, что я знаю, что мог бы использовать разные макеты Foo
в каждом тесте, однако мне нужно было объединить несколько запросов mockFoo
, то есть мне пришлось бы создавать цепочки в каждом тесте.
test1
а затемtest2
. Но может случиться так, что ваша среда непрерывной интеграции будет запускать тесты в другом порядке. Или может случиться так, что вы захотите запуститьtest2
сам, безtest1
первого запуска , и в этом случае произойдет сбой. Модульные тесты всегда должны быть независимы друг от друга; и никогда не должно быть зависимости между отдельными тестами или зависимости от определенного порядка тестов. Принимая во внимание, что цепныеthenReturn
заявления ...thenReturn
, это не правильное решение в данном конкретном случае. Мне кажется, что полчища первооткрывателей здесь, скорее всего, не поняли вопроса.@FixMethodOrder
Для всех, кто ищет что-то, а затем другое исключение вызова:
или
источник
Или даже чище:
источник
Для тех, кто использует spy () и doReturn () вместо метода when ():
то, что вам нужно, чтобы вернуть другой объект при разных вызовах, это:
,
Для классических издевательств:
или за исключением того, что его бросили:
источник