2011-01-20 104 views
0

我正在使用Spring和Mockito进行一些单元测试。 我在springcontext.xml配置的嘲笑如下:运行单元测试时出现弹性上下文问题

<bean id="featureEndpoint" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="com.company.blah.blah.FeatureEndpoint" /> 
</bean> 

我的测试类的构造如下:

@ContextConfiguration(locations= {"/springcontext.xml"}) 
public class FeatureEndpointValidationTest extends JsonEndpointValidationTest { 

    private FeatureEndpoint featureEndpoint; 

    @BeforeClass 
    public void setUp() { 
     featureEndpoint = getBean("featureEndpoint"); 
     super.setEndpoint(featureEndpoint); 
    } 

    @Test 
    . 
    . 
    . 
} 

当运行该测试中,的getBean()引发NPE因为上下文一片空白。如果我将测试类重命名为TestEndpoint(或任何没有字符串'Feature'的东西,它运行得很好,我对这种行为感到沮丧,我已经搜索了所有其他配置文件,但没有发现任何命名冲突他们有一个包含名称“功能”的任何线索,为什么发生这种情况的任何豆

这里是抛出的异常的痕迹:?

java.lang.NullPointerException 
    at com.foo.bar.UnitTest.getBean(UnitTest.java:14) 
    at com.foo.bar.service.api.rest.FeatureEndpointValidationTest.setUp(FeatureEndpointValidationTest.java:30) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.testng.internal.MethodHelper.invokeMethod(MethodHelper.java:580) 
    at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:398) 
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:145) 
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:82) 
    at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:167) 
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:104) 
    at org.testng.TestRunner.runWorkers(TestRunner.java:712) 
    at org.testng.TestRunner.privateRun(TestRunner.java:582) 
    at org.testng.TestRunner.run(TestRunner.java:477) 
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:324) 
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:319) 
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:292) 
    at org.testng.SuiteRunner.run(SuiteRunner.java:198) 
    at org.testng.TestNG.createAndRunSuiteRunners(TestNG.java:821) 
    at org.testng.TestNG.runSuitesLocally(TestNG.java:788) 
    at org.testng.TestNG.run(TestNG.java:708) 
    at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:62) 
    at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:141) 
    at org.apache.maven.surefire.Surefire.run(Surefire.java:177) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345) 
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009) 

感谢

回答

1

您使用冲刺测试,这是很好的尝试像这样设置你的测试:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations="classpath:springcontext.xml) 
public class MyTest { 

    @Autowired 
    private FeatureEndpoint featureEndpoint; 

    @Test 
    public void testSomething() { } 

} 

使用@Autowired注解与Spring的JUnit运行类,所有的自动装配变量将被初始化为相同类型的对应的bean。您也可以使用@Qualifier("featureEndpoint")指定一个bean名称。

如果您只是想访问上下文,请执行ApplicationContextAware,其中包含一个setApplicationContext方法。另外,如果你想验证bean,你可以实现InitializingBean,它将在一个spring容器中,在实例化和初始化之后被调用,在这里你可以断言FeatureEndpoint是否不为null。

这个整个公式的关键是使用SpringJUnit4ClassRunner跑步者类。

相关问题