Итак, вы можете использовать метод ReflectionUtils.setField . Я сделал небольшой пример, он не совсем похож на ваш код, но в целом вы поняли идею.
Итак, вот мой класс в стадии тестирования. Делаем почти так же, как ваш пример. У меня есть метод hello
, чтобы просто проверить и проверить, работает он или нет.
class RateService {
private static Map<String, Object> errorMap = new HashMap<>();
@PostConstruct
public void init () {
this.errorMap = findAllErrors();
}
private Map<String, Object> findAllErrors() {
Map<String, Object> errorMap = new HashMap<>();
errorMap.put("a", new Object());
errorMap.put("b", new Object());
errorMap.put("c", new Object());
return errorMap;
}
// a method for demo purposes
public String hello() {
if (errorMap.size() > 0) {
return String.join(",", errorMap.keySet());
} else {
return "Empty";
}
}
}
Вот мой тестовый класс. Третий аргумент метода setField
- это объект, который будет установлен в этом поле. Итак, вы можете создать там макет или настоящий объект. Я присвоил реальному объекту фиктивные значения. Затем протестировали против этого.
class MainTest {
private RateService rateService;
@BeforeEach
void setUp() {
this.rateService = new RateService();
}
private Map<String, Object> exampleErrorObjects() {
Map<String, Object> errorMap = new HashMap<>();
errorMap.put("x", new Object());
errorMap.put("y", new Object());
errorMap.put("z", new Object());
return errorMap;
}
@Test
void testHello() {
// given:
ReflectionTestUtils.setField(RateService.class, "errorMap", exampleErrorObjects());
// when:
final String result = this.rateService.hello();
// then:
assertEquals("x,y,z", result);
}
}
Я устанавливаю поле stati c в методе тестирования, потому что вы можете захотеть, чтобы ваш класс находился в разных состояниях (на основе поля errorMap
) в каждом тесте .