SpringConconfiguration может сделать это для вас.
Например, в контексте теста ниже «Локальные» классы являются ложными.NotificationService
- это класс, который я хочу проверить.
Я использую компонентное сканирование, чтобы перенести макеты в контекст, но вы также можете легко использовать объявления <bean>
.Обратите внимание на использование use-default-filters = "false".
<context:component-scan base-package="com.foo.config" use-default-filters="false">
<context:include-filter type="assignable"
expression="com.foo.LocalNotificationConfig"/>
</context:component-scan>
<context:component-scan base-package="com.foo.services.notification"
use-default-filters="false">
<context:include-filter type="assignable"
expression="com.foo.services.notification.DelegatingTemplateService"/>
<context:include-filter type="assignable"
expression="com.foo.services.notification.NotificationService"/>
</context:component-scan>
<context:component-scan base-package="com.foo.domain"/>
DelegatingTemplateService - это класс Groovy с @ Delegate.
class DelegatingTemplateService {
@Delegate
TemplateService delegate
}
В тестовом классе я использую тестконтекст и введите сервис для тестирования.В настройках я устанавливаю делегат DelegatingTemplateService:
@RunWith(classOf[SpringJUnit4ClassRunner])
@ContextConfiguration(Array("/spring-test-context.xml"))
class TestNotificationService extends JUnitSuite {
@Autowired var notificationService: NotificationService = _
@Autowired var templateService: DelegatingTemplateService = _
@Before
def setUp {
templateService.delegate = /* Your dynamic mock here */
}
В сервисе поля @Autowired являются личными:
@Component("notificationService")
class NotificationServiceImpl extends NotificationService {
@Autowired private var domainManager: DomainManager = _
@Autowired private var templateService: TemplateService = _
@Autowired private var notificationConfig: NotificationConfig = _