How to test constructor of a class that has a @PostConstruct method using Spring?

AHungerArtist picture AHungerArtist · May 9, 2012 · Viewed 39.4k times · Source

If I have a class with a @PostConstruct method, how can I test its constructor and thus its @PostConstruct method using JUnit and Spring? I can't simply use new ClassName(param, param) because then it's not using Spring -- the @PostConstruct method is not getting fired.

Am I missing something obvious here?

public class Connection {
    private String x1;
    private String x2;

    public Connection(String x1, String x2) {
        this.x1 = x1;
        this.x2 = x2;
    }

    @PostConstruct
    public void init() {
        x1 = "arf arf arf";
    }

}


@Test
public void test() {
    Connection c = new Connection("dog", "ruff");
    assertEquals("arf arf arf", c.getX1());
}

I have something similar (though slightly more complex) than this and the @PostConstruct method does not get hit.

Answer

mrembisz picture mrembisz · May 9, 2012

If the only container managed part of Connection is your @PostContruct method, just call it manually in a test method:

@Test
public void test() {
  Connection c = new Connection("dog", "ruff");
  c.init();
  assertEquals("arf arf arf", c.getX1());
}

If there is more than that, like dependencies and so on you can still either inject them manually or - as Sridhar stated - use spring test framework.