2011-01-20 101 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跑步者類。

相關問題