CategoriesTesting

Spock Framework – I – InProgress

Spock aims to be a more powerful alternative to the traditional JUnit stack, by leveraging Groovy features.

Groovy is a JVM-based language which seamlessly integrates with Java

At a glance Spock framework is ,

  • BDD style testing and specification framework
  • Which run Junit under the hood
  • For Java and Groovy applications
  • Test case writing in groovy
  • All three component combine with single library
    • Unit testing
    • Mocking
    • BDD
All three component combine with single library

Spock Features Highlights

  • Highly Expressive
  • Spock enforce a clear test structure
  • BDD style test can be expressive through the “given, when and then” blocks
  • Compatible with all major build tools and continuous integration providers
  • Inbuilt Mocking and Stubbing
  • Parameterized test and Data driven test ( Data table based and SQL table based )
Continue reading
CategoriesTestingTips and Tricks

Spring bean creation testing – Feature Toggling

Spring auto-configuration can be tricky when it comes to conditional based bean creation. The best way to ensure the proper application context is through meticulous testing.

Spring Boot 2.X provides some test helpers for easily configuring an ApplicationContext to simulate auto-configuration test scenarios.

Application Context Runner

Utility design to run an ApplicationContext and provide AssertJ style assertions. The test is best used as a field of a test class,

Let’s try this with a use case,

Feature Toggling

Let’s assume the application consists of multiple features and these features are toggled ( bean creation ) by environment configuration-based conditions,

Feature Definition

All the features of the application are defined as an enum and the enum contains a code and the application configuration itself. For simplicity let’s consider an app with 3 features.

public enum AppHubFeature {
LOGISTIC_UNIT_UPDATE("Logistic Unit Update", FeatureConfig.LOGISTIC_UNIT_UPDATE),
ORDER_STATUS_UPDATE("Order Status Update", FeatureConfig.ORDER_STATUS_UPDATE),
STOCK_ADJUSTMENT("Stock Adjustment", FeatureConfig.STOCK_ADJUSTMENT);
public static class FeatureConfig {
public static final String LOGISTIC_UNIT_UPDATE = "app-hub.feature.logistic-unit-update";
public static final String ORDER_STATUS_UPDATE = "app-hub.feature.order-line-status-update";
public static final String STOCK_ADJUSTMENT = "app-hub.feature.stock-adjustment";
}
public final String feature;
public final String config;
AppHubFeature(String feature, String config) {
this.feature = feature;
this.config = config;
}
public String config() {
return this.config;
}
public String feature() {
return this.feature;
}
}
Continue reading