Чтобы ответить на то, когда вы хотели бы и не хотели бы использовать его, часть вопроса.
Когда использовать SpringJUnit4ClassRunner
IMO SpringJUnit4ClassRunner следует использовать очень экономно. Существуют значительные накладные расходы, связанные с запуском контейнера Spring для запуска модульного теста.
Обычно я использую SpringJUnit4ClassRunner для тестирования:
- что компоненты вводятся (автоматически подключаются), как и ожидалось
- что данные конфигурации вводятся, как и ожидалось
При внедрении компонентов могут возникнуть проблемы, например, если аннотация @Qualifier
не используется или используется неправильно.
При загрузке конфигурации из нескольких файлов yaml вы можете проверить, что карты объединяются, как и ожидалось, с соответствующими переопределениями.
По крайней мере, у меня всегда есть простой тест SpringJUnit4ClassRunner для проверки правильности запуска контейнера Spring.
Когда не использовать SpringJUnit4ClassRunner
Я бы не стал использовать SpringJUnit4ClassRunner для тестирования функций, не связанных с Spring, в моем тестируемом коде. Что, по моему опыту, означает большую часть функциональности.
Таким образом, это означает, что любые автоматически подключаемые компоненты и вводимые данные конфигурации должны быть смоделированы. Это может означать довольно много установочного кода для ваших модульных тестов. Однако этот установочный код нужно написать только один раз для всех тестов в тестируемом классе. Также намного быстрее запускать модульные тесты с фиктивными компонентами.
Я делаю насмешки простыми и использую Spock для имитации компонентов. Пример заводного кода:
import spock.lang.Specification
class FooManagerTest extends Specification {
FooManager cut
void createMockFooReporter() {
FooReporter mockFooReporter = Mock(FooReporter)
mockFooReporter.fooFormatter = Mock(FooFormatter)
}
void setup() {
cut = new FooManager()
cut.fooReporter = createMockFooReporter()
}
void "Basic test"() {
// Do a basic test using 'cut'
}
}
В этом примере тестируемый класс FooManager
имеет автосвязывание FooReporter
, которое само содержит автосвязывание FooFormatter
.
20.08.2019