Я пытаюсь протестировать метод с именем loadData
, определенный в MainController
, который возвращает результат в виде строки. Несмотря на то, что этот метод фактически возвращает данные, когда веб-приложение запускается в контейнере сервлета (или когда я отлаживаю код), данные не возвращаются, когда я вызываю его из тестового класса на основе JUnit 5
с Mockito
.
Вот моя конфигурация:
@ContextConfiguration(classes = {WebAppInitializer.class, AppConfig.class, WebConfig.class})
@Transactional
@WebAppConfiguration
public class TestMainController {
@InjectMocks
private MainController mainController;
private MockMvc mockMvc;
@BeforeEach
public void init() {
mockMvc = MockMvcBuilders.standaloneSetup(this.mainController).build();
}
@Test
public void testLoadData() throws Exception {
MvcResult mvcResult = mockMvc
.perform(MockMvcRequestBuilders.get("/loadData.ajax"))
.andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
Assertions.assertNotNull(mvcResult.getResponse().getContentAsString(), "response should not be null");
}
}
Тест не пройден из-за java.lang.NullPointerException
, так как this.mainController
равно null
.
Сведения о среде:
Spring version: 5.0.3
JUnit version: 5.0.3
mockito version: 1.9.5
hamcrest version: 1.3
json-path-assert version: 2.2.0
Изменить: вот метод loadData
для MainController
:
@RequestMapping(value = "/loadData.ajax", method = RequestMethod.GET)
public String loadData(HttpServletRequest request, HttpServletResponse response) {
List list = mainService.loadData(); // starts a transaction and invokes the loadData method of mainDAO repository which basically loads data from the database
return JSONArray.fromObject(list).toString();
}
loadData.ajax
. Не могли бы вы помочь мне настроить тестовую среду? Пробовал следующее через руководство, которым вы поделились, но безуспешно:mockMvc.perform(get("/loadData.ajax"));
- person talha06   schedule 11.02.2018MainController
. Что странно в вашем тесте, так это то, что у вас есть и веб-конфигурация, и обычная, разве у вас не должно быть ни одной? - person M. Deinum   schedule 11.02.2018AppConfig
предназначен для создания биновsession factory
иtransaction manager
.WebConfig
реализуетWebMvcConfigurer
и определяет все остальные необходимые bean-компоненты, включаяview revolvers
,interceptors
,tasks
и т. д. - person talha06   schedule 11.02.2018Autowire
контроллер. Вы создаете экземплярMockMvc
следующим образом. Если конструктор контроллера принимает какой-либо параметр, вы передаете его контроллеру.MockMvcBuilders.standaloneSetup(new YourController()).build();
- person Ali.Wassouf   schedule 11.02.2018public class TestMainController { @InjectMocks private MainController mainController; @Mock private MainService mainService; private MockMvc mockMvc; @BeforeEach public void setup() { // Process mock annotations MockitoAnnotations.initMocks(this); this.mockMvc = MockMvcBuilders.standaloneSetup(new MainController()).build(); } @Test public void testLoadData() throws Exception { this.mockMvc.perform(get("/loadData.ajax")).andExpect(status().isOk()); } }
- person talha06   schedule 11.02.2018MainController
, чтобы мы могли видеть, что там происходит. - person M. Deinum   schedule 12.02.2018@SpringJUnitWebConfig
и@SpringJUnitConfig
в одном и том же тестовом классе. Spring будет учитывать только один из них, а именно первый найденный. - person Sam Brannen   schedule 12.02.2018