0

我正在尝试使用 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。loader=com.xyz.CustomContextLoader但如果我从中删除@ContextConfiguration,它工作正常。

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

4

1 回答 1

0

另一种解决方案可能是您在测试类中使用“@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 是一个后备,调用一个模拟对象的真实方法
于 2019-08-26T11:36:55.257 回答