Junit Mockito для глобальной java .util.Map - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь протестировать метод, но у него есть глобальная переменная, которая имеет значение null. Пожалуйста, помогите мне присвоить значение глобальной переменной, например, Map 1005 * Мой основной класс:

@Service
public class RateServiceImpl implements RateService {

    protected final Log logger = LogFactory.getLog(getClass());

    @Autowired
    private RaterDao raterDao;

    private Map<String, StringAttribute> errorMap = new HashMap<String, StringAttribute>();

    @Resource
    private MessageSource msg;

    @PostConstruct
    public void init() throws Exception {
        **errorMap** = findAllClientErrors();
    }

public Map<String, StringAttribute> findAllClientErrors() throws Exception {

        List<Error> errorList = raterDao.findAllClientErrors();

        for (int index = 0; index < errorList.size(); index++) {
            StringAttribute st = new StringAttributeImpl();
            st.setName(errorList.get(index).getDescription());
            st.setValue(errorList.get(index).getResolution());
            errorMap.put(errorList.get(index).getCode(), st);
        }

        return errorMap;
    }


    @Override
    public StringAttribute findClientError(String code) throws Exception {

        StringAttribute error = new StringAttributeImpl();

        if (code.equals(Constants.ERROR_CODE_SETTING_UNAVAILABLE)) {
            error.setName(msg.getMessage("SETTING.MESSAGE.ERROR", null,null));
            error.setValue(msg.getMessage("SETTING.MESSAGE.RESOLUTION", null,null));
            return error;
        }

        StringAttribute map = errorMap.get(code);

        if (map == null || map.getName().isEmpty()) {
            error.setName(msg.getMessage("DEFAULT.MESSAGE", new Object[] { code }, null));
            error.setValue("");
        } else {
            error.setName(errorMap.get(code).getName());
            error.setValue(errorMap.get(code).getValue());
        }

        return error;
    }

    }

Я пробовал несколько решений, но не работает, временная карта становится пустой или нулевой. Работает любое решение, которое проходит мой тестовый пример. Я хочу протестировать findClientError (String code), и проблема связана с errorMap

1 Ответ

0 голосов
/ 16 июня 2020

Итак, вы можете использовать метод 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) в каждом тесте .

...