24

如果我有一个带有@PostConstruct 方法的类,我如何使用JUnit 和Spring 测试它的构造函数以及它的@PostConstruct 方法?我不能简单地使用 new ClassName(param, param) 因为它没有使用 Spring——@PostConstruct 方法没有被触发。

我在这里遗漏了一些明显的东西吗?

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());
}

我有一些类似的东西(虽然稍微复杂一些),并且@PostConstruct 方法没有受到影响。

4

4 回答 4

26

如果容器管理的唯一部分Connection是您的@PostContruct方法,只需在测试方法中手动调用它:

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

如果还有更多,例如依赖项等,您仍然可以手动注入它们,或者 - 正如 Sridhar 所说 - 使用弹簧测试框架。

于 2012-05-09T11:15:27.160 回答
14

看看Spring JUnit Runner

您需要在测试类中注入您的类,以便 spring 构建您的类并调用 post 构造方法。参考宠物诊所的例子。

例如:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:your-test-context-xml.xml")
public class SpringJunitTests {

    @Autowired
    private Connection c;

    @Test
    public void tests() {
        assertEquals("arf arf arf", c.getX1();
    }

    // ...
于 2012-05-09T09:28:37.010 回答
0

@PostConstruct必须改变对象的状态。因此,在 JUnit 测试用例中,获取 bean 后检查对象的状态。如果与 设置的状态相同@PostConstruct,则测试成功。

于 2012-05-09T09:24:18.897 回答
-1

默认情况下,Spring 不会意识到 @PostConstruct 和 @PreDestroy 注释。要启用它,您必须注册“CommonAnnotationBeanPostProcessor”或在 bean 配置文件中指定“”。

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

或者

<context:annotation-config />

于 2012-05-09T09:53:39.790 回答