【问题标题】:Spring MVC testing with MockMvc - webapplicationcontext is null使用 MockMvc 进行 Spring MVC 测试 - webapplicationcontext 为空
【发布时间】:2014-06-05 10:40:19
【问题描述】:

我正在尝试使用 junit 和 spring-test api 为 Spring MVC 控制器创建 JUnit 测试用例。由于我的应用程序中有很多 beandefinitions,因此我使用了 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。但是如果我从@ContextConfiguration 中删除loader=com.xyz.CustomContextLoader,它就可以正常工作。

我需要同时拥有延迟加载和 MockMvc 进行测试。我错过了什么吗?有没有更好的解决方案?

【问题讨论】:

  • 您的自定义加载器可能会破坏正常行为(渲染@WebAppConfiguration 无用。通常WebDelegatingSmartContextLoader 用于加载类(使用@WebAppConfiguration 时)您可能想看看您的自定义实现。
  • 你是正确的@M。迪南。我的 CustomLoader 破坏了正常行为。我删除了它并挖掘了一些弹簧代码。我使用所有 Lazyinit 配置创建了一个“GenericWebApplicationContext”的单例实例。它奏效了。

标签: spring spring-mvc junit mockmvc


【解决方案1】:

另一种解决方案可能是您在测试类中使用“@ContextConfiguration”-Annotation

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = { CustomDataTestConfig.class })
@WebMvcTest(ClientDataEndpoint.class)
public class ClientDataEndpointMvcTest
  • 用代码创建一个“@Configuration”文件

(CustomDataTestConfig.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 对象的真实方法

【讨论】:

    猜你喜欢
    • 2013-07-06
    • 2020-04-19
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2014-05-31
    • 2018-05-25
    相关资源
    最近更新 更多