Guice binding at parent-module, is there another point I can bind before the test executes?

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Guice binding at parent-module, is there another point I can bind before the test executes?

Chris S.
With some help from TestNG contributors, I've managed to get a default Guice ParentModule setup by using the ServiceLoader and IAltersuiteListener. Now I have another barrier I'd like to overcome.

From this ParentModule point, I've been able to bind the suite configuration and browser capabilities. One of the bindings is an Iterable<DesiredCapabilities> that I would then like to break down into one-per-suite. I'd prefer to avoid annotations and test class inheritance if possible, and opt for something behind the scenes, as I think a complex test class rig here will make it more difficult to train new testers.

I've done this in the past with a JUnit runner, where the final modules are composed at the time the test method object is created, which is where the injection takes place as well.

To break it down, this is the flow I'm looking for:
1. When TestNG starts, auto-load the configuration and browser capabilities. Say one for firefox, one chrome. (done)
2. For each of the capabilities in the iterable, duplicate the tests/suite.
3. Pass a capability instance (firefox) to a test, then create a webdriver guice module and inject the test instance with the capability+module..
4. Run the test class (or method?)
5. Repeat 3 and 4 for Chrome.

Through some experimentation, I've managed to copy the suite per browser instance (for number 2 above), but I don't know if there's a way I could pass the specific browser capability into the test or testxml at the IAlterSuiteLIstener level. Also, if I try using an ITestListener to perform the later binding, I get an error on the @Inject fields in my test, as I believe TestNG is trying to resolve those bindings much earlier on in the process.

Has anybody else out there done something similar? I'd love to hear how others have done this, even if they haven't used Guice. I think the key here may be finding the right interface to perform the final injection, but it's been difficult experimenting on my own.

Thanks for taking the time to read this. I'm excited to see where our suites can go from here.




--
You received this message because you are subscribed to the Google Groups "testng-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
Visit this group at https://groups.google.com/group/testng-users.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Guice binding at parent-module, is there another point I can bind before the test executes?

Krishnan Mahadevan
Chris,

Can you please share an example which can help me better visualise your problem ? I didn't quite get the problem statement properly.
Even if its non functional code, its fine, but I was hoping that the code would give me a better idea of what you are trying to achieve.

and oh btw, I thought of capturing what I shared as a sample in that GITHUB bug as a blog post, so that its easier for someone else to find the same information.



Thanks & Regards
Krishnan Mahadevan

"All the desirable things in life are either illegal, expensive, fattening or in love with someone else!"
My Scribblings @ http://wakened-cognition.blogspot.com/
My Technical Scribbings @ http://rationaleemotions.wordpress.com/

On Sat, Jan 20, 2018 at 11:23 AM, Chris S. <[hidden email]> wrote:
With some help from TestNG contributors, I've managed to get a default Guice ParentModule setup by using the ServiceLoader and IAltersuiteListener. Now I have another barrier I'd like to overcome.

From this ParentModule point, I've been able to bind the suite configuration and browser capabilities. One of the bindings is an Iterable<DesiredCapabilities> that I would then like to break down into one-per-suite. I'd prefer to avoid annotations and test class inheritance if possible, and opt for something behind the scenes, as I think a complex test class rig here will make it more difficult to train new testers.

I've done this in the past with a JUnit runner, where the final modules are composed at the time the test method object is created, which is where the injection takes place as well.

To break it down, this is the flow I'm looking for:
1. When TestNG starts, auto-load the configuration and browser capabilities. Say one for firefox, one chrome. (done)
2. For each of the capabilities in the iterable, duplicate the tests/suite.
3. Pass a capability instance (firefox) to a test, then create a webdriver guice module and inject the test instance with the capability+module..
4. Run the test class (or method?)
5. Repeat 3 and 4 for Chrome.

Through some experimentation, I've managed to copy the suite per browser instance (for number 2 above), but I don't know if there's a way I could pass the specific browser capability into the test or testxml at the IAlterSuiteLIstener level. Also, if I try using an ITestListener to perform the later binding, I get an error on the @Inject fields in my test, as I believe TestNG is trying to resolve those bindings much earlier on in the process.

Has anybody else out there done something similar? I'd love to hear how others have done this, even if they haven't used Guice. I think the key here may be finding the right interface to perform the final injection, but it's been difficult experimenting on my own.

Thanks for taking the time to read this. I'm excited to see where our suites can go from here.




--
You received this message because you are subscribed to the Google Groups "testng-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
Visit this group at https://groups.google.com/group/testng-users.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "testng-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
Visit this group at https://groups.google.com/group/testng-users.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Guice binding at parent-module, is there another point I can bind before the test executes?

Chris S

Krishnan,

A blog article would be great!


So I have some code snippets below as well as a few extra thoughts. I hope they help clarify the situation better.


Sticking with the "run the suite in chrome and firefox" scenario...


1. I see GuiceParentModuleInjection has the ability to clone the suites, so here we could technically pair each suite with a browser:
Suite + DesiredCapabilities (name, version, platform) for Chrome
Suite + DesiredCapabilities (name, version, platform) for Firefox

Would it be possible to link the DesiredCapabilities for chrome to the suite, or pass those Chrome capabilities down to the test's object graph without firefox? I've been thinking in terms of objects in memory at runtime, but could a potential workaround involve setting the capabilities as suite properties?

2. If it is possible to pass Chrome DesiredCapabilities into the suite, would it be possible for a listener to pick up those capabilities and do some things to the driver before the test method runs? I'm thinking about things like a driver shutdown hook, maximizing the screen, and other actions around test preparation.



-------------------------------------

## The command-line run:

mvn verify -Dbrowsers="chrome,firefox"
- or -
mvn verify -Dwebdriver.remote.url={url} -Dwebdriver.remote.browser.file={browsersFile.xml}

-------------------------------------

## Here is the test class with an inner TestModule

@Guice(modules = TestModule.class)
public class LifeCycleTest {

    @Inject
    private WebDriver driver;

    @Inject
    @Named("foo")
    private String injectedFromInnerModule;

    @Inject
    @Named("foo.bar.example")
    private String injectedFromParentModule;

    @Test
    public void shouldFindInstance() {
        assertThat(driver).isNotNull();
    }

    @Test
    public void shouldInjectFromModule() {
        assertThat(injectedFromInnerModule).isEqualTo("baz");
    }

    @Test
    public void shouldInject_fromParentModule_viaServiceLoader() {
        assertThat(injectedFromParentModule).isEqualTo("ewok");
    }

    public static class TestModule extends AbstractModule
    {
        @Override
        protected void configure() {
            install(new WebDriverModule());
        }

        @Provides
        @Named("foo")
        String provideInjectableString() {
            return "baz";
        }
    }
}


-------------------------------------

## Here are the classes for the ServiceLoader + ParentModule setup

@AutoService(ITestNGListener.class)
public class GuiceParentModuleInjection implements IAlterSuiteListener {

    private static final Logger LOGGER = LogManager.getLogger();

    @Override
    public void alter(List<XmlSuite> suites) {
        suites.forEach(s -> s.setParentModule(ParentModule.class.getName()));
    }
}


public class ParentModule extends AbstractModule {

    private static final Logger LOGGER = LogManager.getLogger();


    @Override
    protected void configure() {
        install(new ConfigurationModule());
        install(new RemoteServicesModule());
    }

    @Provides
    @Named("foo.bar.example")
    public String provideFooBarForTesting() {
        return "ewok";
    }

    @Provides
    public Iterable<DesiredCapabilities> provideCaps(BrowserConfiguration browserConfiguration) {
        return browserConfiguration.getCapabilities();
    }
}


-------------------------------------

## Here's the WebDriverModule, currently instantiated via the TestModule at the moment.

Two things to note here:

1. The getCapabilities method calls "iterator().next()", which is a hack to use the first browser for now.
2. I cut out a couple of methods that don't directly relate to try to keep it short.

public class WebDriverModule extends AbstractModule {

    private Capabilities capabilities;

    // TODO: enable implementation
    private final boolean isProxiedWebDriver = false;


    @Override
    public void configure() {

    }

    @Provides
    @Singleton
    public WebDriver webDriver(BrowserConfiguration configuration, @Named("proxyPort") int proxyPort) {

        Capabilities capabilities = getCapabilities(configuration, proxyPort);
        WebDriverFactory factory = WebDriverFactories.getInstance(configuration, capabilities);

        try {
            return factory.create();
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }

    }

    private Capabilities getCapabilities(BrowserConfiguration configuration, @Named("proxyPort") int proxyPort) {

        if (this.capabilities == null) {
            this.capabilities = configuration.getCapabilities().iterator().next();
        }
        return isProxiedWebDriver ? createProxyCapabilities("localhost", proxyPort).merge(this.capabilities)
            : this.capabilities;
    }

}

-------------------------------------

## The BrowserConfiguration class is quite large, so I've summed it up here as if it were an interface:

    public Iterable<DesiredCapabilities> getCapabilities() {
    public boolean isRemoteWebDriverEnabled() {
    public URL getRemoteWebDriverAddress() {


-------------------------------------

## Browsers file example:

<?xml version="1.0" encoding="UTF-8" ?>
<browsers>
    <browser>
        <name>firefox</name>
        <version>23</version>
        <platform>Windows 7</platform>
    </browser>
    <browser>
        <name>phantomjs</name>
        <platform>linux</platform>
    </browser>
    <browser>
        <name>chrome</name>
    </browser>
</browsers>






On Saturday, January 20, 2018 at 6:26:29 AM UTC-7, Krishnan Mahadevan wrote:
Chris,

Can you please share an example which can help me better visualise your problem ? I didn't quite get the problem statement properly.
Even if its non functional code, its fine, but I was hoping that the code would give me a better idea of what you are trying to achieve.

and oh btw, I thought of capturing what I shared as a sample in that GITHUB bug as a blog post, so that its easier for someone else to find the same information.

Here's the blog post : <a href="https://rationaleemotions.wordpress.com/2018/01/20/automatically-wire-in-a-parent-guice-module-into-your-testng-test/" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Frationaleemotions.wordpress.com%2F2018%2F01%2F20%2Fautomatically-wire-in-a-parent-guice-module-into-your-testng-test%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFre-GoyDUksiBS1R_PrE8VycqhTg&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Frationaleemotions.wordpress.com%2F2018%2F01%2F20%2Fautomatically-wire-in-a-parent-guice-module-into-your-testng-test%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFre-GoyDUksiBS1R_PrE8VycqhTg&#39;;return true;">https://rationaleemotions.wordpress.com/2018/01/20/automatically-wire-in-a-parent-guice-module-into-your-testng-test/ 
 

Thanks & Regards
Krishnan Mahadevan

"All the desirable things in life are either illegal, expensive, fattening or in love with someone else!"
My Scribblings @ <a href="http://wakened-cognition.blogspot.com/" target="_blank" rel="nofollow" onmousedown="this.href=&#39;http://www.google.com/url?q\x3dhttp%3A%2F%2Fwakened-cognition.blogspot.com%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHzOdYJCASIDF_28vQtkp9gnKAYSQ&#39;;return true;" onclick="this.href=&#39;http://www.google.com/url?q\x3dhttp%3A%2F%2Fwakened-cognition.blogspot.com%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHzOdYJCASIDF_28vQtkp9gnKAYSQ&#39;;return true;">http://wakened-cognition.blogspot.com/
My Technical Scribbings @ <a href="http://rationaleemotions.wordpress.com/" target="_blank" rel="nofollow" onmousedown="this.href=&#39;http://www.google.com/url?q\x3dhttp%3A%2F%2Frationaleemotions.wordpress.com%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEcBOKyRn0lpL8LDbBuyAlKdwgXwQ&#39;;return true;" onclick="this.href=&#39;http://www.google.com/url?q\x3dhttp%3A%2F%2Frationaleemotions.wordpress.com%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEcBOKyRn0lpL8LDbBuyAlKdwgXwQ&#39;;return true;">http://rationaleemotions.wordpress.com/

On Sat, Jan 20, 2018 at 11:23 AM, Chris S. <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="FO6_9XiwEQAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">pol...@...> wrote:
With some help from TestNG contributors, I've managed to get a default Guice ParentModule setup by using the ServiceLoader and IAltersuiteListener. Now I have another barrier I'd like to overcome.

From this ParentModule point, I've been able to bind the suite configuration and browser capabilities. One of the bindings is an Iterable<DesiredCapabilities> that I would then like to break down into one-per-suite. I'd prefer to avoid annotations and test class inheritance if possible, and opt for something behind the scenes, as I think a complex test class rig here will make it more difficult to train new testers.

I've done this in the past with a JUnit runner, where the final modules are composed at the time the test method object is created, which is where the injection takes place as well.

To break it down, this is the flow I'm looking for:
1. When TestNG starts, auto-load the configuration and browser capabilities. Say one for firefox, one chrome. (done)
2. For each of the capabilities in the iterable, duplicate the tests/suite.
3. Pass a capability instance (firefox) to a test, then create a webdriver guice module and inject the test instance with the capability+module..
4. Run the test class (or method?)
5. Repeat 3 and 4 for Chrome.

Through some experimentation, I've managed to copy the suite per browser instance (for number 2 above), but I don't know if there's a way I could pass the specific browser capability into the test or testxml at the IAlterSuiteLIstener level. Also, if I try using an ITestListener to perform the later binding, I get an error on the @Inject fields in my test, as I believe TestNG is trying to resolve those bindings much earlier on in the process.

Has anybody else out there done something similar? I'd love to hear how others have done this, even if they haven't used Guice. I think the key here may be finding the right interface to perform the final injection, but it's been difficult experimenting on my own.

Thanks for taking the time to read this. I'm excited to see where our suites can go from here.




--
You received this message because you are subscribed to the Google Groups "testng-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to <a href="javascript:" target="_blank" gdf-obfuscated-mailto="FO6_9XiwEQAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">testng-users...@googlegroups.com.
To post to this group, send email to <a href="javascript:" target="_blank" gdf-obfuscated-mailto="FO6_9XiwEQAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">testng...@....
Visit this group at <a href="https://groups.google.com/group/testng-users" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://groups.google.com/group/testng-users&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/group/testng-users&#39;;return true;">https://groups.google.com/group/testng-users.
For more options, visit <a href="https://groups.google.com/d/optout" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;">https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "testng-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
Visit this group at https://groups.google.com/group/testng-users.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Guice binding at parent-module, is there another point I can bind before the test executes?

Krishnan Mahadevan

Chris,

Let me go through your post and get back to you over the weekend.

I don’t know a lot about Guice APIs so I would need time to figure them out as well.

 

Thanks & Regards

Krishnan Mahadevan

 

"All the desirable things in life are either illegal, expensive, fattening or in love with someone else!"

My Scribblings @ http://wakened-cognition.blogspot.com/

My Technical Scribbings @ http://rationaleemotions.wordpress.com/

 

From: <[hidden email]> on behalf of Chris S <[hidden email]>
Reply-To: <[hidden email]>
Date: Tuesday, January 23, 2018 at 1:15 AM
To: testng-users <[hidden email]>
Subject: Re: [testng-users] Guice binding at parent-module, is there another point I can bind before the test executes?

 

 

Krishnan,

A blog article would be great!


So I have some code snippets below as well as a few extra thoughts. I hope they help clarify the situation better.


Sticking with the "run the suite in chrome and firefox" scenario...


1. I see GuiceParentModuleInjection has the ability to clone the suites, so here we could technically pair each suite with a browser:
Suite + DesiredCapabilities (name, version, platform) for Chrome
Suite + DesiredCapabilities (name, version, platform) for Firefox

Would it be possible to link the DesiredCapabilities for chrome to the suite, or pass those Chrome capabilities down to the test's object graph without firefox? I've been thinking in terms of objects in memory at runtime, but could a potential workaround involve setting the capabilities as suite properties?

2. If it is possible to pass Chrome DesiredCapabilities into the suite, would it be possible for a listener to pick up those capabilities and do some things to the driver before the test method runs? I'm thinking about things like a driver shutdown hook, maximizing the screen, and other actions around test preparation.



-------------------------------------

## The command-line run:

mvn verify -Dbrowsers="chrome,firefox"
- or -
mvn verify -Dwebdriver.remote.url={url} -Dwebdriver.remote.browser.file={browsersFile.xml}

-------------------------------------

## Here is the test class with an inner TestModule

@Guice(modules = TestModule.class)
public class LifeCycleTest {

    @Inject
    private WebDriver driver;

    @Inject
    @Named("foo")
    private String injectedFromInnerModule;

    @Inject
    @Named("foo.bar.example")
    private String injectedFromParentModule;

    @Test
    public void shouldFindInstance() {
        assertThat(driver).isNotNull();
    }

    @Test
    public void shouldInjectFromModule() {
        assertThat(injectedFromInnerModule).isEqualTo("baz");
    }

    @Test
    public void shouldInject_fromParentModule_viaServiceLoader() {
        assertThat(injectedFromParentModule).isEqualTo("ewok");
    }

    public static class TestModule extends AbstractModule
    {
        @Override
        protected void configure() {
            install(new WebDriverModule());
        }

        @Provides
        @Named("foo")
        String provideInjectableString() {
            return "baz";
        }
    }
}


-------------------------------------

## Here are the classes for the ServiceLoader + ParentModule setup

@AutoService(ITestNGListener.class)
public class GuiceParentModuleInjection implements IAlterSuiteListener {

    private static final Logger LOGGER = LogManager.getLogger();

    @Override
    public void alter(List<XmlSuite> suites) {
        suites.forEach(s -> s.setParentModule(ParentModule.class.getName()));
    }
}


public class ParentModule extends AbstractModule {

    private static final Logger LOGGER = LogManager.getLogger();


    @Override
    protected void configure() {
        install(new ConfigurationModule());
        install(new RemoteServicesModule());
    }

    @Provides
    @Named("foo.bar.example")
    public String provideFooBarForTesting() {
        return "ewok";
    }

    @Provides
    public Iterable<DesiredCapabilities> provideCaps(BrowserConfiguration browserConfiguration) {
        return browserConfiguration.getCapabilities();
    }
}


-------------------------------------

## Here's the WebDriverModule, currently instantiated via the TestModule at the moment.

Two things to note here:

1. The getCapabilities method calls "iterator().next()", which is a hack to use the first browser for now.
2. I cut out a couple of methods that don't directly relate to try to keep it short.

public class WebDriverModule extends AbstractModule {

    private Capabilities capabilities;

    // TODO: enable implementation
    private final boolean isProxiedWebDriver = false;


    @Override
    public void configure() {

    }

    @Provides
    @Singleton
    public WebDriver webDriver(BrowserConfiguration configuration, @Named("proxyPort") int proxyPort) {

        Capabilities capabilities = getCapabilities(configuration, proxyPort);
        WebDriverFactory factory = WebDriverFactories.getInstance(configuration, capabilities);

        try {
            return factory.create();
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }

    }

    private Capabilities getCapabilities(BrowserConfiguration configuration, @Named("proxyPort") int proxyPort) {

        if (this.capabilities == null) {
            this.capabilities = configuration.getCapabilities().iterator().next();
        }
        return isProxiedWebDriver ? createProxyCapabilities("localhost", proxyPort).merge(this.capabilities)
            : this.capabilities;
    }

}

-------------------------------------

## The BrowserConfiguration class is quite large, so I've summed it up here as if it were an interface:

    public Iterable<DesiredCapabilities> getCapabilities() {
    public boolean isRemoteWebDriverEnabled() {
    public URL getRemoteWebDriverAddress() {


-------------------------------------

## Browsers file example:

<?xml version="1.0" encoding="UTF-8" ?>
<browsers>
    <browser>
        <name>firefox</name>
        <version>23</version>
        <platform>Windows 7</platform>
    </browser>
    <browser>
        <name>phantomjs</name>
        <platform>linux</platform>
    </browser>
    <browser>
        <name>chrome</name>
    </browser>
</browsers>

 

 

 

 

 


On Saturday, January 20, 2018 at 6:26:29 AM UTC-7, Krishnan Mahadevan wrote:

Chris,

 

Can you please share an example which can help me better visualise your problem ? I didn't quite get the problem statement properly.

Even if its non functional code, its fine, but I was hoping that the code would give me a better idea of what you are trying to achieve.

 

and oh btw, I thought of capturing what I shared as a sample in that GITHUB bug as a blog post, so that its easier for someone else to find the same information.

 

 


Thanks & Regards
Krishnan Mahadevan

"All the desirable things in life are either illegal, expensive, fattening or in love with someone else!"
My Scribblings @ http://wakened-cognition.blogspot.com/

My Technical Scribbings @ http://rationaleemotions.wordpress.com/

 

On Sat, Jan 20, 2018 at 11:23 AM, Chris S. <<a href="javascript:" target="_blank">pol...@...> wrote:

With some help from TestNG contributors, I've managed to get a default Guice ParentModule setup by using the ServiceLoader and IAltersuiteListener. Now I have another barrier I'd like to overcome.

 

From this ParentModule point, I've been able to bind the suite configuration and browser capabilities. One of the bindings is an Iterable<DesiredCapabilities> that I would then like to break down into one-per-suite. I'd prefer to avoid annotations and test class inheritance if possible, and opt for something behind the scenes, as I think a complex test class rig here will make it more difficult to train new testers.

 

I've done this in the past with a JUnit runner, where the final modules are composed at the time the test method object is created, which is where the injection takes place as well.

 

To break it down, this is the flow I'm looking for:

1. When TestNG starts, auto-load the configuration and browser capabilities. Say one for firefox, one chrome. (done)

2. For each of the capabilities in the iterable, duplicate the tests/suite.

3. Pass a capability instance (firefox) to a test, then create a webdriver guice module and inject the test instance with the capability+module..

4. Run the test class (or method?)

5. Repeat 3 and 4 for Chrome.

 

Through some experimentation, I've managed to copy the suite per browser instance (for number 2 above), but I don't know if there's a way I could pass the specific browser capability into the test or testxml at the IAlterSuiteLIstener level. Also, if I try using an ITestListener to perform the later binding, I get an error on the @Inject fields in my test, as I believe TestNG is trying to resolve those bindings much earlier on in the process.

 

Has anybody else out there done something similar? I'd love to hear how others have done this, even if they haven't used Guice. I think the key here may be finding the right interface to perform the final injection, but it's been difficult experimenting on my own.

 

Thanks for taking the time to read this. I'm excited to see where our suites can go from here.

 

 

 

 

--
You received this message because you are subscribed to the Google Groups "testng-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to <a href="javascript:" target="_blank">testng-users...@....
To post to this group, send email to <a href="javascript:" target="_blank">testng...@....
Visit this group at https://groups.google.com/group/testng-users.
For more options, visit https://groups.google.com/d/optout.

 

--
You received this message because you are subscribed to the Google Groups "testng-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
Visit this group at https://groups.google.com/group/testng-users.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "testng-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
Visit this group at https://groups.google.com/group/testng-users.
For more options, visit https://groups.google.com/d/optout.