当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring测试具有@PostConstruct方法的类的构造函数?

鲁才艺
2023-03-14

如果我有一个带有@PostConstruct方法的类,如何使用 JUnit 和 Spring 测试它的构造函数和它的@PostConstruct方法?我不能简单地使用新的 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方法没有被命中。

共有3个答案

岳城
2023-03-14

@PostCon结构体必须改变对象的状态。所以,在JUnit测试用例中,在获取bean后检查对象的状态。如果它与@PostCon结构体设置的状态相同,则测试成功。

司寇飞航
2023-03-14

看看Spring JUnit Runner。

您需要在您的测试类中注入您的类,这样spring将构造您的类,并且还将调用post construct方法。参考宠物诊所的例子。

例如:

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

    // ...
苏硕
2023-03-14

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

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

如果有更多,比如依赖项等等,你仍然可以手动注入它们,或者——正如Srid har所说——使用Spring测试框架。

 类似资料:
  • 无论我用什么方法尝试,无论是主构造函数还是次构造函数,我都不知道如何在kotlin中声明一个带有超类和构造函数的新类。 这是我最想做的,但它给出了一个错误,期望成员声明。 这是我认为主要构造函数的外观,但它给出了相同的错误。在Internet上搜索没有帮助,我只能找到第二个示例。 那么,用一个超类和它的一个构造函数创建一个类的所有有效方法是什么呢?

  • 问题内容: 以下是两种方法: 具有所有类属性的构造函数 优点:我必须输入确切数量的参数类型,所以如果出现错误,编译器会警告我(顺便说一句,有什么方法可以防止错误地在参数列表中切换两个Integer的问题?) 缺点:如果我有很多属性,则实例化行可能会变得很长,并且可能跨越两行或更多行 setter和默认的空构造函数 优点:我可以清楚地看到自己的设置,因此,如果我做错了什么,我可以在键入时立即查明它(

  • 问题内容: 在春季,bean的类可能没有公共构造函数,而只有私有构造函数吗?创建bean时会调用此私有构造函数吗?谢谢。 问题答案: 是的,Spring可以调用私有构造函数。如果找到具有正确参数的构造函数,无论可见性如何,它将使用反射将其构造函数设置为可访问的。

  • 我试图模拟一个有嵌套类的类。那个嵌套类有一个构造函数参数。当我试图使用mockito而不是mockito测试时,实际的方法正在执行。 我在外部类上做了@injectmock,在内部类上做了@Mock。 我像往常一样尝试使用@Mock调用类,但是实际的方法eth1()正在被访问。 需要模拟内部ClassB方法,而不是访问真实方法。 作为mockito的初学者,我试图澄清这一点。但在访问void方法等

  • 我有一个类似这样的表单类: 我的测试用例类是这样的: 但是,当我运行phpunit时,它会抛出一些错误,如: 即使我提供参数,它也会在不同的文件中抛出相同的错误 然后,我得到了类B的构造函数相同的错误(类B的构造函数具有与A相似的形式)。 有没有其他方法,我可以测试功能或我缺少的东西。 我不想使用mock(getMockBuilder(),setMethods(),getMock())进行测试,因

  • 我在网上做了很多搜索,但找不到一个使用自动连接构造函数进行单元测试的例子。我正在使用Spring将属性文件中的值自动关联到我的应用程序。我想对我的应用程序进行单元测试。java的start方法,但我有一个自动连接的构造函数,所以我不知道如何实例化MyApp。在没有自动连线属性的情况下,我在单元测试中这样做: 我不想模拟自动布线,因为我需要从属性文件中获取值,并且为了使事情更加复杂,我正在通过注释配