Проблема Spring Context при запуске модульного теста - PullRequest
0 голосов
/ 20 января 2011

Я запускаю несколько юнит-тестов, используя 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», он работает отлично. Я сбит с толку этим поведением. Я искал все другие файлы конфигурации для любых конфликтов имен, но ни один из них есть какой-нибудь компонент, содержащий имя «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 Ответ

1 голос
/ 20 января 2011

Вы используете спринт-тест, и это хорошо.Попробуйте настроить свой тест следующим образом:

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

    @Autowired
    private FeatureEndpoint featureEndpoint;

    @Test
    public void testSomething() { }

}

Используя аннотацию @Autowired с классом запуска Spring JUnit, все переменные с автопроводкой будут инициализированы для соответствующих им бинов одного и того же типа.Вы также можете использовать @Qualifier("featureEndpoint") для указания имени компонента.

Если вы просто хотите получить доступ к контексту, реализуйте ApplicationContextAware, который содержит метод setApplicationContext.

Также, если выЕсли вы хотите проверить bean-компоненты, вы можете реализовать InitializingBean, который в пружинном контейнере будет вызываться после создания экземпляра и инициализации, где вы можете утверждать, не является ли FeatureEndpoint нулевым.

Ключ к этому целомууравнение, однако, заключается в использовании класса бегуна SpringJUnit4ClassRunner.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...