Пересмешивание @Resource при использовании MockMvcBuilders.standaloneSetup - PullRequest
0 голосов
/ 28 сентября 2018

Моя команда в настоящее время создает API SpringBoot.Ниже приведен фрагмент того, как моя команда издевается над тестами наших контроллеров.Это работает, когда у нас есть простые классы как зависимости.

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestController {

    private MockMvc mockMvc;

    @Mock
    private MyService myService;

    @Autowired
    @InjectMocks
    private MyController myController;

    @Before
    public void setup() {

        //Build the controller mock handler
        mockMvc = MockMvcBuilders
            .standaloneSetup(myController)
            .build();
    }

Мы не можем понять, как смоделировать @Resource, как показано ниже для аналогичного теста.

@Resource(name = "domainNameToCode")
private Map<String, Integer> domainCodes;

1 Ответ

0 голосов
/ 28 сентября 2018

Поскольку domainCodes является приватным, ваш контроллер должен иметь способ установить значение для него либо конструктор, либо установщик.

Сеттер

    @Autowired()
    @Qualifier("domainNameToCode")
    public void setDomainCodes(Map<String, Integer> domainCodes) {
        ...
    }

Конструктор

  @Autowired()
    @Qualifier("domainNameToCode")
    public MyController(Map<String, Integer> domainCodes){

    }

В ваших тестах теперь вы можете вводить макеты.


Если вы не хотите редактировать свой источник, вы можете использовать отражение, чтобы установить личную переменную экземпляра для объекта

//Using reflection to set a private field on an object
FieldUtils.writeField(controllerInstance, "domainCodes", new HashMap<>()) ;
...