【问题标题】:How to pass argument to extension class constructor in JUnit5如何在 JUnit5 中将参数传递给扩展类构造函数
【发布时间】:2020-09-23 11:36:19
【问题描述】:

我在将参数从测试类传递到其扩展类构造函数时遇到问题。 从 JUnit4 迁移到 JUnit5 时出现问题。 (对于 JUnit4 工作正常) 在 JUnit4 中的测试类看起来像:

public class TestClass{
    @Rule
    @Autowired
    public SupportClass supportClass;
}

并且支持类看起来:

   @Component
   @RequiredArgsConstructor
   public class SupportClass implements TestRule {
        private final EntityManager entityManager;

        @Override
        public Statement apply(Statement base, Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                final Statistics statistics = ((Session) entityManager.getDelegate()).getSessionFactory().getStatistics();
                statistics.clear();

                base.evaluate();
            }
         };
        }
   }

在 JUnit5 中我正在尝试做(测试类):

@ExtendWith(SupportClass.class)
public class TestClass{

    @Autowired
    public SupportClass supportClass;
}

支持类的外观:

   @Component
   @RequiredArgsConstructor
   public class SupportClass implements AfterEachCallback, BeforeEachCallback {
        private final EntityManager entityManager;

    @Override
    public void beforeEach(ExtensionContext extensionContext) throws Exception {
        final Statistics statistics = ((Session) entityManager.getDelegate()).getSessionFactory().getStatistics();
        statistics.clear();

    }

    @Override
    public void afterEach(ExtensionContext extensionContext) throws Exception {
        final Statistics statistics = ((Session) entityManager.getDelegate()).getSessionFactory().getStatistics();
        statistics.clear();

    }
   }

当我尝试执行测试时,我得到 java.lang.NoSuchMethodException: .SupportClass.init() 异常。我知道这与缺少非 args 构造函数有关。不幸的是,我的 SupportClass 需要这个参数才能工作。问题是如何将这个 entityManager 从测试类传递到支持作为参数?

【问题讨论】:

标签: spring-boot hibernate junit5 lombok


【解决方案1】:

这是一个草图。没有检查编译错误,没有导入,可能不是所有细节:

@SpringBootTest
public class TestClass{

    @Autowired
    @RegisterExtension
    SupportClass support;

    @Test
    void myTest() {...}
}

public class SupportClass implements AfterEachCallback, BeforeEachCallback {
    private final EntityManager entityManager;

    SupportClass(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Override
    public void beforeEach(ExtensionContext extensionContext) throws Exception {
        final Statistics statistics = ((Session) entityManager.getDelegate()).getSessionFactory().getStatistics();
        statistics.clear();
    }

    @Override
    public void afterEach(ExtensionContext extensionContext) throws Exception {
        final Statistics statistics = ((Session) entityManager.getDelegate()).getSessionFactory().getStatistics();
        statistics.clear();

    }
}

我认为SupportClass 不是一个好名字,但那是另一回事。

【讨论】:

    猜你喜欢
    • 2015-08-17
    • 1970-01-01
    • 2023-04-04
    • 2015-10-11
    • 1970-01-01
    • 2016-03-17
    • 2022-01-13
    • 2015-04-26
    相关资源
    最近更新 更多