Ответ 1
Чтобы ответить на мой собственный вопрос, секрет был в версии Spring. Мы использовали Spring 3.1.3, тогда как я предположил, что они использовали Spring 3.2 (они постоянно говорили о недавнем обновлении версии Spring).
Объяснение было здесь, сообщение в блоге, которое я наткнулся на свою охоту, чтобы зафиксировать его: http://blog.springsource.org/2012/11/07/spring-framework-3-2-rc1-new-testing-features/
И скопируйте копию соответствующей части:
Использование общих factory методов в конфигурации Spring ни в коем случае не является специфическим для > тестирования, а общие factory методы, такие как EasyMock.createMock(MyService.class) или Mockito.mock(MyService.class) часто используются для создания динамических макетов для Spring beans в контексте > тестового приложения. Например, до Spring Framework 3.2 следующая конфигурация может не автоподтвердить OrderRepository в OrderService. Причина в том, что > в зависимости от порядка, в котором beans инициализируется в контексте приложения, > Spring потенциально выводит тип orderRepository bean как java.lang.Object > вместо com.example.repository.OrderRepository.
Итак, как я решил эту проблему? Ну, я сделал следующие шаги:
- создать новый модуль maven
- отфильтруйте те тесты, которые требовали насмешек. Все тесты, не связанные с фальсификацией, будут нормально выполняться в сборке Spring в отдельном прогоне Failsafe (я создал базовый пакет "clean" и отсортировал их так)
- Поместите все издевавшиеся тесты в базовый пакет под названием "mocked" и выполните дополнительный запуск в Failsafe для издевавшихся тестов.
- Каждый из насмешанный тест использует Springockito для создания макетов. Я также использую аннотации Springockito, чтобы просто сделать @ReplaceWithMock на месте. Каждый издеваемый тест затем аннотируется с @DirtiesContext, поэтому контекст загрязняется после каждого теста, а контекст Spring повторно вводится с каждым тестом.
Единственное разумное объяснение, которое я мог бы дать, заключается в том, что контекст эффективно загрязняется, потому что существует инфраструктура (Springockito), которая берет на себя управление Spring beans из структуры Spring. Я не знаю, правильно ли это, но это лучшее объяснение, которое я мог бы придумать. Это, по сути, определение грязного контекста, поэтому мы должны обозначить его как грязный.
Используя эту стратегию, я снова создал и запускал, и все тесты работают нормально. Это не идеально, но он работает, и он последователен.