Search code examples
javaspringspring-bootjunittogglz

SpringBootTest with Togglz


I just recently added togglz to the spring-boot 3.1.9 application, which contains also much stuff like spring-security, spring-data, etc.

Maven dependency:

<dependency>
  <groupId>org.togglz</groupId>
  <artifactId>togglz-spring-boot-starter</artifactId>
  <version>4.4.0</version>
</dependency>

Feature enum:

import org.togglz.core.Feature;

public enum ApplicationFeatures implements Feature {
    MY_FEATURE
}

Configuration:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.togglz.core.manager.EnumBasedFeatureProvider;
import org.togglz.core.spi.FeatureProvider;
import org.togglz.core.user.NoOpUserProvider;
import org.togglz.core.user.UserProvider;

@Configuration
public class TogglesConfiguration {

    @Bean
    public FeatureProvider featureProvider() {
        return new EnumBasedFeatureProvider(ApplicationFeatures.class);
    }

    @Bean
    public UserProvider userProvider() {
        return new NoOpUserProvider();
    }
}

Application.yaml:

togglz:
  features:
    MY_FEATURE:
      enabled: true

Simple service that uses:

import de.telekom.wom.workorder.config.toggles.ApplicationFeatures;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    public String getA() {
        if (ApplicationFeatures.MY_FEATURE.isActive())
            return "OK";
        else
            return "INACTIVE";
    }
}

Simple spring boot test:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest//(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class Testik {

    @Autowired
    MyService myService;

    @Test
    void name() {
        myService.getA();
    }
}

The problem is that if I don't start real web environment, so use simple @SpringBootTest wihtout (webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT), I am getting an error:

java.lang.IllegalStateException: Could not find the FeatureManager. For web applications please verify that the TogglzFilter starts up correctly. In other deployment scenarios you will typically have to implement a FeatureManagerProvider as described in the 'Advanced Configuration' chapter of the documentation.

Although if I create a sample project, it works as expected. Where could the problem be? Why the rise of the web environment can affect Togglz?

Logs by success:

DEBUG [FeatureContext.findFeatureManagerInClassLoader()] Provider org.togglz.core.context.BeanFinderFeatureManagerProvider returned FeatureManager

Logs by error:

DEBUG [FeatureContext.findFeatureManagerInClassLoader()] No FeatureManager provided by org.togglz.core.context.BeanFinderFeatureManagerProvider

UPDATE: I just realized that if I remove the actuator dependency from the pom.xml file, then everything works as it should. Any ideas why?

 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>

Solution

  • Here is a link to an issue on Github:

    https://github.com/togglz/togglz/issues/1202