У меня очень простая структура проекта:
.
├── build.gradle
├── {gradle stuff}
└── src
├── main
│ ├── java
│ │ └── my_app
│ │ ├── ByeByer.java
│ │ ├── Greeter.java
│ │ ├── Helloer.java
│ │ ├── MyApp.java
│ │ └── MyConfig.java
│ └── resources
│ └── application.properties
└── test
├── java
│ └── my_app
│ └── e2e
│ ├── E2EConfig.java
│ ├── E2ESteps.java
│ └── MyE2ETest.java
└── resources
└── features
└── myFeature.feature
Код для классов следующий.
Интерфейс Greeter
:
public interface Greeter {
public String greet();
}
Это в основном фиктивный интерфейс для генератора приветствий.
У нас есть две реализации этого интерфейса, ByeByer
, который возвращает «Пока» и Helloer
, который возвращает «Привет».
main
находится в MyApp
:
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(MyApp.class, args);
}
}
И конфигурация следующая:
@Configuration
public class MyConfig {
@Bean
Greeter byebyer(){
return new ByeByer();
}
}
, определяющая, что в производстве, реализацию Greeter
, которую мы хотимиспользуется тот, который генерирует сообщение «Пока-пока».
Тестовая часть в основном представляет собой такой сценарий:
Feature: Just a feature
Scenario: Just a scenario
Given just a given
When just a when
Then just a then
И класс определения шага для него:
@SpringBootTest(
classes = {MyApp.class})
public class E2ESteps implements En{
@Autowired
Greeter greeter;
public E2ESteps() {
Given("^just a given$", () -> { });
When("^just a when$", () -> { });
Then("^just a then$", () -> {
assertEquals("Hello", greeter.greet());
});
}
}
Я передаю MyApp.class
, потому что я хочу использовать ту же конфигурацию, что и на производстве, но я хочу переопределить только реализацию Greeter
, чтобы она возвращала "Hello" во время теста.
Тестовый бегун просто:
@RunWith(Cucumber.class)
@CucumberOptions(
glue = { "my_app.e2e"},
features = "classpath:features"
)
public class MyE2ETest {
}
Как мне изменить мой проект, чтобы я использовалто же дерево зависимостей, что и производственное, но перекрывающее только определенные bean-компоненты (в данном случае реализацию Greeter производства)?