【问题标题】:thread-weaver with hibernate unit testing带有休眠单元测试的线程编织器
【发布时间】:2023-03-13 01:40:02
【问题描述】:

我正在尝试为我的休眠测试编写一个多线程单元测试。 我选择了 thread-weaver 并玩了一下。 我使用 HSQL 数据库引擎进行休眠测试,这是一个内存数据库。 在我想编写一些多线程单元测试之前,它工作得很好。 由于我是织线机的新手,我可能会犯一些新手错误。 我知道线程编织器正在使用其定制的加载器加载我的类。 但是在@ThreadedBefore 我尝试为 HSQL 设置 sessionFactory 之一。但是,我得到了一堆错误日志,例如

log4j:ERROR "org.apache.log4j.ConsoleAppender" was loaded by [sun.misc.Launcher$AppClassLoader@ece88d2].
log4j:ERROR Could not instantiate appender named "console".
log4j:ERROR A "org.apache.log4j.ConsoleAppender" object is not assignable to a "org.apache.log4j.Appender" variable.
log4j:ERROR The class "org.apache.log4j.Appender" was loaded by 
log4j:ERROR [com.google.testing.instrumentation.InstrumentedClassLoader@2a57a184] whereas object of type 


java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at com.google.testing.threadtester.MethodCaller.invoke(MethodCaller.java:71)
    at com.google.testing.threadtester.BaseThreadedTestRunner.runTests(BaseThreadedTestRunner.java:179)
    at com.google.testing.threadtester.BaseThreadedTestRunner.runTests(BaseThreadedTestRunner.java:143)
    at com.amazon.amazonclicksdali.test.simpleTest.run(simpleTest.java:39)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at com.intellij.junit4.JUnit4TestRunnerUtil$IgnoreIgnoredTestJUnit4ClassRunner.runChild(JUnit4TestRunnerUtil.java:306)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at com.google.testing.threadtester.MethodCaller.invoke(MethodCaller.java:68)
    ... 30 more
Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at com.google.testing.threadtester.MethodCaller.invoke(MethodCaller.java:71)
    at com.google.testing.threadtester.ThreadedTestWrapper.runTests(ThreadedTestWrapper.java:71)
    ... 35 more
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at com.google.testing.threadtester.MethodCaller.invoke(MethodCaller.java:68)
    ... 36 more
Caused by: java.lang.NullPointerException
    at com.google.testing.instrumentation.InstrumentedClassLoader.loadClassData(InstrumentedClassLoader.java:152)
    at com.google.testing.instrumentation.InstrumentedClassLoader.findClass(InstrumentedClassLoader.java:137)
    at com.google.testing.instrumentation.InstrumentedClassLoader.loadClass(InstrumentedClassLoader.java:113)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:278)
    at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:170)
    at org.hibernate.cfg.Configuration.applyHibernateValidatorLegacyConstraintsOnDDL(Configuration.java:1663)
    at org.hibernate.cfg.Configuration.applyConstraintsToDDL(Configuration.java:1653)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1445)
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1375)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:717)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:188)
    at com.amazon.amazonclicksdali.test.scheduler.repository.TestSessionHelper.getSessionFactory(TestSessionHelper.java:20)
    at com.amazon.amazonclicksdali.test.simpleTest.setup(simpleTest.java:45)
    ... 41 more

一个简单的测试是这样的

public class simpleTest {
    Script<RDBInternalReportRepository> main;
    Script<RDBInternalReportRepository> second;
    final RDBInternalReportRepository target = new RDBInternalReportRepository();
    SessionFactory sessionFactory;

    RDBInternalReport internalReport1;



    @Test
    public void run() {
        new ThreadedTestRunner().runTests(getClass(), RDBInternalReportRepository.class);
    }

    @ThreadedBefore
    public void setup() throws Exception {
        TestSessionHelper testSessionHelper = new TestSessionHelper();
        sessionFactory = testSessionHelper.getSessionFactory();
        target.setSessionFactory(sessionFactory);
        internalReport1 = new RDBInternalReport();
        internalReport1.setReferenceId("aaa");
        internalReport1.setReportName("testReportName");
        internalReport1.setSubmittedDate(new DateTime(2015, 1, 1, 0, 0));
        internalReport1.setMarketplaceId(1);
        internalReport1.setHashKey("hashValues");
        internalReport1.setDedupingString("uid");
        internalReport1.setState(ReportState.SUBMITTED);
        internalReport1.setErrorCount(0);
        target.createOrUpdateInternalReport(internalReport1);
    }
    @ThreadedTest
    public void testSession() throws Exception {

        main = new Script<RDBInternalReportRepository>(target);
        second = new Script<RDBInternalReportRepository>(target);

        main.addTask(new ScriptedTask<RDBInternalReportRepository>() {
            @Override
            public void execute() throws Exception {
                IInternalReport report1 = target.getInternalReport("aaa");
                releaseTo(second);
            }
        });
        second.addTask(new ScriptedTask<RDBInternalReportRepository>() {
            @Override
            public void execute() throws Exception {
                releaseTo(main);
            }
        });
        new Scripter<RDBInternalReportRepository>(main, second).execute();

    }


}

它甚至无法加载 sessionFactory 这是一个简单的 HSQL 数据库。

【问题讨论】:

    标签: multithreading hibernate unit-testing hsqldb thread-weaver


    【解决方案1】:

    看起来 NullPointerException 是由 getSystemResourceAsStream() 返回 null 引起的。请参阅此处的第 136 行:https://github.com/google/thread-weaver/blob/5c316abcfdfa1832df981f90cfa5c5811003012e/main/com/google/testing/instrumentation/InstrumentedClassLoader.java

    我发现了以下问题,这听起来像是对正在发生的事情的一个很好的解释:getSystemResourceAsStream() returns null

    听起来好像可以将以下内容添加到“InstrumentedCLassLoader.findClass()”中

    InputStream input = getSystemResourceAsStream(resourceName);
    if (input == null) {
      return Thread.currentThread().getContextClassLoader().findClass(className);
    }
    

    您可以尝试使用此修复程序从源代码构建 threadweaver 吗?或者,我需要运行您的整个测试和验证。

    【讨论】:

    • 非常感谢您对此进行调查。不幸的是,我现在无法构建这个源。我们正在将线程编织器作为第三方 jar 文件引入,我需要一些时间来与我的代码库进行集成测试。
    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    相关资源
    最近更新 更多