View Javadoc

1   package com.atlassian.webdriver.testing.rule;
2   
3   import com.atlassian.pageobjects.TestedProduct;
4   import com.atlassian.pageobjects.inject.InjectionContext;
5   import com.atlassian.pageobjects.util.InjectingTestedProducts;
6   import com.google.common.base.Supplier;
7   import org.junit.runner.Description;
8   import org.junit.runners.model.Statement;
9   
10  import javax.annotation.Nonnull;
11  
12  import static com.google.common.base.Preconditions.checkNotNull;
13  
14  /**
15   * <p/>
16   * Class injection rule. Access via {@link com.atlassian.webdriver.testing.rule.InjectionRules}.
17   *
18   * <p/>
19   * Also implement {@link com.atlassian.pageobjects.inject.InjectionContext} for convenience in tests.
20   *
21   * @since 2.1
22   */
23  public final class ClassInjectionRule<P extends TestedProduct<?>> implements InjectingTestRule
24  {
25      private final Supplier<P> product;
26  
27      ClassInjectionRule(Supplier<P> productSupplier)
28      {
29          this.product = checkNotNull(productSupplier, "productSupplier");
30      }
31  
32  
33      @Override
34      public Statement apply(final Statement base, final Description description)
35      {
36          return new Statement() {
37              @Override
38              public void evaluate() throws Throwable
39              {
40                  if (supportsInjection())
41                  {
42                      injectionContext().injectStatic(description.getTestClass());
43                  }
44                  base.evaluate();
45              }
46          };
47      }
48  
49      boolean supportsInjection()
50      {
51          return InjectingTestedProducts.supportsInjection(product.get());
52      }
53  
54      InjectionContext injectionContext()
55      {
56          return InjectingTestedProducts.asInjectionContext(product.get());
57      }
58  
59      @Override
60      @Nonnull
61      public <T> T getInstance(@Nonnull Class<T> type)
62      {
63          return injectionContext().getInstance(type);
64      }
65  
66      @Override
67      public void injectStatic(@Nonnull Class<?> targetClass)
68      {
69          injectionContext().injectStatic(targetClass);
70      }
71  
72      @Override
73      public void injectMembers(@Nonnull Object targetInstance)
74      {
75          injectionContext().inject(targetInstance);
76      }
77  
78      @Nonnull
79      @Override
80      public <T> T inject(@Nonnull T target)
81      {
82          return injectionContext().inject(target);
83      }
84  }