Tool to enforce that certain classes are ony ever constructed once
public class ExampleTest {
@Rule
public SingletonEnforcer singletonEnforcer = SingletonEnforcer.enforcePackage("example");
@Test(expected = AssertionError.class)
public void singletonConstructedTwiceWillThrowException() {
singletonEnforcer.during(() -> {
new Singleton();
new Singleton();
}).checkSingletonsAreConstructedOnce(Singleton.class);
}
@Test(expected = AssertionError.class)
public void leakedDependencyWillThrowAssertionError() {
singletonEnforcer.during(() -> {
LeakedDependencyInterface leakedDependency = new LeakedDependency();
new SingletonWithDependency(leakedDependency, new Object());
new ClassWithLeakedDependency(leakedDependency);
}).checkDependencyIsNotLeaked(SingletonWithDependency.class, LeakedDependencyInterface.class);
}
}
Dependency:
<dependency>
<groupId>io.github.theangrydev</groupId>
<artifactId>singleton-enforcer</artifactId>
<version>2.1.0</version>
</dependency>
- Made the public API thread safe
- Added documentation for the public API
- Turned
SingletonEnforcer
into a JUnit@Rule
- Added a method
SingletonEnforcer.during
that takes aRunnable
that should execute some code that the assertions will be made about - Added a checks to make sure that the classes in the package to enforce are instrumented before use
- Added a check to make sure that instrumented classes are not used outside of
SingletonEnforcer.during
- Tool to enforce that certain classes are ony ever constructed once
SingletonEnforcer
must besetUp
before use with the package to cover andtearDown
must be called after useSingletonEnforcer.checkSingletons
checks that the given classes were only constructed onceSingletonEnforcer.checkSingletonDependenciesAreNotLeaked
checks that a dependency of a singleton is only used inside that singleton and not passed on to other objects