问题
I am running the next test:
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/META-INF/spring/applicationContext.xml" })
public class FloorServiceTest {
    @Autowired
    private FloorService floorService;
    @Test
    public void testFloorService() {
        floorService.findById((long)1);
    }
}
With the file applicationContext.xml under the folder /APP/src/main/resources/META-INF/spring/
But it seems not to Autowire correctly the bean:
  org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.confloorapp.services.FloorServiceTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.confloorapp.services.FloorService com.confloorapp.services.FloorServiceTest.floorService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.confloorapp.services.FloorService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
回答1:
Try
@ContextConfiguration(locations = { "classpath:/META-INF/spring/applicationContext.xml" })
Honestly I would step away from the xml and go this route. Change
@ContextConfiguration(locations = { "/META-INF/spring/applicationContext.xml" })
to
@ContextConfiguration(classes = { FloorServiceTestConfig.class })
And create the about class
@Configuration
public class FloorServiceTestConfig
{
    @Bean
    public FloorService floorService()
    {
          return new FloorService();
    }
}
This way when you need to mock your beans for class you're not testing it looks like below
@Configuration
public class FloorServiceTestConfig
{
    @Bean
    public FloorService floorService()
    {
          return Mockito.mock(FloorService.class);
    }
}
回答2:
The idea of @Configuration given above works nice. But for that you have to annotate your classes with @Configuration.
This is not a nice idea when it comes to testing offline i.e when in your organisation test cases are not executed at built time.
In that case going by 
@ContextConfiguration(locations = { "classpath:/META-INF/spring/applicationContext.xml" }) will be a nice idea.
For using this method, take care of the following:
- Check your classpath in - .classpathfile of your project.
- If you cannot write the path of - applicationContextrelative to classpath.
You can have one more file as applicationContextTest folder kept in your test case folder and then one can use
@ContextConfiguration(locations = { "classpath:applicationContextTest.xml"})
回答3:
In your case you should use:
@ContextConfiguration(locations = "file:src/main/resources/META-INF/spring/applicationContext.xml")
Another hint, I see that you use your production applicationContext.xml in your test environment, IMHO it's not a good practice, try use a specific one for testing like applicationContext-test.xml, so you can play with your test context without hurting your production environment.
来源:https://stackoverflow.com/questions/23618039/spring-contextconfiguration