В Java у меня есть класс, например,
public class A {
private final Map<Integer, String> steps = ImmutableMap.of(
1, "one"
);
public String getStepOne() {
return steps.get(1);
}
}
Теперь мне нужно каким-то образом смоделировать эту глобальную переменную в модульном тесте. К сожалению, мне сказали избегать каких-либо изменений в исходном коде тестируемого класса для целей тестирования, особенно, просто предоставление получателя не будет удовлетворительным решением. Я пытался смоделировать статический вызов метода, например
@RunWith(PowerMockRunner.class)
@PrepareForTest({A.class, ImmutableMap.class})
public class ATest {
private A subj = new A();
@Before
public void setUp() {
PowerMockito.mockStatic(ImmutableMap.class);
ImmutableMap<Object, Object> mockedMap = ImmutableMap.of(1, "NEW ONE");
BDDMockito.given(ImmutableMap.of()).willReturn(mockedMap);
}
@Test
public void testGetStepOne() {
System.out.println(subj.getStepOne());
}
}
Но это не работает, он печатает "one
", а не "NEW ONE
". Я подозреваю, что поддельные вызовы статических методов таким способом невозможны, если они вызываются из инициализации глобальной переменной ... Кто-нибудь знает, есть ли способ смоделировать эту переменную (как я уже сказал, без изменений в классе * 1009? *)?
============ РЕДАКТИРОВАТЬ ==================
Хорошо, я согласен, что в общем случае нет смысла издеваться над неизменной картой, но на самом деле карта выглядит примерно так:
private final Map<Integer, B> steps = ImmutableMap.of(
1, new B()
);
и что мне действительно нужно, так это издеваться над объектомтипа B, который является одним из значений, потому что к нему обращаются в других методах класса через steps.get(...)
.