[英]Spring Context issue while running unit test
我正在使用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
.
.
.
}
當我運行此測試時,因為context為null,所以getBean()會拋出NPE。 但是,如果我將測試類重命名為TestEndpoint(或沒有字符串'Feature'的任何東西,它運行得很好。我對此行為感到困惑。我已經在所有其他配置文件中搜索了任何命名沖突,但沒有發現任何沖突)有任何包含“功能”名稱的bean。有關為什么發生這種情況的任何線索?
這是引發異常的痕跡:
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)
謝謝
您正在使用sprint-test,這很好。 嘗試像這樣設置測試:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:springcontext.xml)
public class MyTest {
@Autowired
private FeatureEndpoint featureEndpoint;
@Test
public void testSomething() { }
}
在Spring JUnit運行器類中使用@Autowired
批注,所有自動裝配的變量將被初始化為它們對應的相同類型的bean。 您也可以使用@Qualifier("featureEndpoint")
指定bean名稱。
如果您只想訪問上下文,請實現包含setApplicationContext
方法的ApplicationContextAware
。
另外,如果要驗證Bean,則可以實現InitializingBean
,該實例將在實例化和初始化之后在彈簧容器中調用,可以在其中聲明FeatureEndpoint是否不為null。
但是,整個方程式的關鍵是使用SpringJUnit4ClassRunner
類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.