Весеннее тестирование MVC с MockMvc - контекст веб-приложения имеет значение null

Я пытаюсь создать тестовые примеры JUnit для контроллеров Spring MVC, используя API junit и spring-test. Поскольку в моем приложении много определений компонентов, я использовал LazyInitDefaultBeanDefinitionDocumentReader и написал файл CustomContextLoader.

Мой пример тестового класса будет:

    @RunWith(SpringJUnit4ClassRunner.class)  
    @ContextConfiguration(loader=com.xyz.CustomXmlContextLoader.class,
    locations={"file:///D:/web-module/src/test/resources/conf/application-config-controller-test.xml"})
    @WebAppConfiguration
    public class LoginControllerTest {


        @Autowired  
        private WebApplicationContext wac;

        private MockMvc mockMvc;  

        @Test  
        public void testShowForm_forgetUserID() throws Exception {  

        System.out.println("webappcontext::"+wac);
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();  

        mockMvc.perform(get("/login.form")).andExpect(status().isOk());

        }  
}

Здесь, если я выполняю приведенный выше код, wac не подключается автоматически и возвращает null. Но если я уберу loader=com.xyz.CustomContextLoader из @ContextConfiguration, все будет нормально.

Мне нужно иметь как ленивую загрузку, так и MockMvc для тестирования. Я что-то упустил? Есть ли лучшее решение?


person vijay bharathy    schedule 05.06.2014    source источник
comment
Ваш пользовательский загрузчик, вероятно, нарушает нормальное поведение (отображая @WebAppConfiguration бесполезным. Обычно WebDelegatingSmartContextLoader используется для загрузки классов (при использовании @WebAppConfiguration). Возможно, вы захотите взглянуть на это для своей пользовательской реализации.   -  person M. Deinum    schedule 05.06.2014
comment
Вы правы @M. Деинум. Мой CustomLoader нарушает нормальное поведение. Я удалил его, и я выкопал немного весеннего кода. Я создал одноэлементный экземпляр GenericWebApplicationContext со всеми конфигурациями Lazyinit. Это сработало.   -  person vijay bharathy    schedule 12.06.2014


Ответы (1)


Другим решением может быть использование аннотации «@ContextConfiguration» в вашем тестовом классе.

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = { CustomDataTestConfig.class })
@WebMvcTest(ClientDataEndpoint.class)
public class ClientDataEndpointMvcTest
  • Создайте файл "@Configuration" с кодом

(Кустомдататестконфиг.java):

@Configuration 
public class CustomDataTestConfig
{
    @Bean
    public LoginControllerEndpoint LoginControllerEndpoint()
    {
          return Mockito.mock(LoginControllerEndpoint.class);
    }
}

Мой пример для теста Mvc:

RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = { ClientDataTestConfig.class })
@WebMvcTest(ClientDataEndpoint.class)
public class ClientDataEndpointMvcTest
{

  @MockBean
  private ClientDataEndpoint clientDataEndpoint;

  @Autowired
  private MockMvc mockMvc;

  // MockitoJUnitRunner
  @InjectMocks
  private ClientDataEndpoint sut;

  @Autowired
  private WebApplicationContext wac;

  @Autowired
  MockHttpSession session;

  @Autowired
  MockHttpServletRequest request;

  @Before
  public void beforeTest()
  {
    // Mocking the Web Context Beans
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
        when(clientDataEndpoint.getBirol()).thenCallRealMethod();
  }
  @Test
  public void testClientdata() throws Exception
  {
    ServletContext servletContext = wac.getServletContext();
    Assert.assertNotNull(servletContext);
    // simple jUnitTest
     Assert.assertEquals("birol", this.clientDataEndpoint.getBirol());


    // Testing Rest API Endpoint
     MvcResult result = this.mockMvc.perform(get("/clientdata/birol").accept("application/json")).andExpect(status().isOk()).andReturn();
  }
  • "когда(clientDataEndpoint.getBirol()).thenCallRealMethod();" в @Before - это запасной вариант, чтобы вызвать реальный метод объекта Mocked
person Birol Efe    schedule 26.08.2019