【问题标题】:Spring Context issue while running unit test运行单元测试时出现 Spring Context 问题
【发布时间】:2011-01-20 17:41:51
【问题描述】:

我正在使用 Spring 和 Mockito 运行一些单元测试。 我在 springcontext.xml 中配置了 mocks 如下:

<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'的东西,它运行得非常好。我对这种行为感到困惑。我已经搜索了所有其他配置文件以查找任何命名冲突,但没有一个有任何包含名称“功能”的 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)

谢谢

【问题讨论】:

    标签: java unit-testing spring maven mockito


    【解决方案1】:

    您正在使用 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,在spring容器中,在实例化和初始化之后会被调用,你可以断言FeatureEndpoint是否不为null。

    整个方程式的关键是使用SpringJUnit4ClassRunner runner 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-23
      • 2010-09-25
      • 2019-05-30
      • 2020-12-15
      • 2020-12-24
      • 2013-02-09
      • 1970-01-01
      • 2017-07-21
      相关资源
      最近更新 更多