Тест проходит, потому что он ничего не делает:)
Когда вы опускаете аннотацию @TestExecutionListeners
, Spring регистрирует 3 прослушивателя по умолчанию, включая одного, называемого DependencyInjectionTestExecutionListener
. Это слушатель, ответственный за сканирование вашего тестового класса в поисках вещей для инъекций, включая аннотации @Resource
. Этот слушатель попытался внедрить tObj
и завершился неудачей из-за неопределенной области видимости.
Когда вы объявляете @TestExecutionListeners({})
, вы подавляете регистрацию DependencyInjectionTestExecutionListener
, и поэтому тесту вообще никогда не вводят tObj
, а поскольку ваш тест не проверяет наличие tObj
, он проходит .
Измените ваш тест так, чтобы он сделал это, и он потерпит неудачу:
@Test
public void testBean() {
assertNotNull("tObj is null", tObj);
}
Итак, с вашим пустым @TestExecutionListeners
тест проходит, потому что ничего не происходит .
Теперь перейдем к исходной проблеме. Если вы хотите попробовать зарегистрировать область запроса в тестовом контексте, посмотрите на исходный код WebApplicationContextUtils.registerWebApplicationScopes()
, вы найдете строку:
beanFactory.registerScope(WebApplicationContext.SCOPE_REQUEST, new RequestScope());
Вы можете попробовать это и посмотреть, как у вас получится, но могут быть странные побочные эффекты, потому что на самом деле вы не должны делать это в тесте.
Вместо этого я бы порекомендовал перефразировать ваш тест, чтобы вам не не требовалось запрашивать bean-объекты с областью видимости. Это не должно быть трудным, жизненный цикл @Test
не должен быть длиннее жизненного цикла bean-объекта в области запросов, если вы пишете автономные тесты. Помните, что нет необходимости тестировать механизм определения объема, это часть Spring, и вы можете предположить, что он работает.