Java 配置Junit+;弹簧&x2B;冬眠4+;maven:Null指针获取会话
我希望有人能帮助我。我是新手,现在真的很困惑。我用谷歌搜索了很多次,但我还是很困惑。 在经历了几个错误之后。。。我陷入了nullPointerException 我有一个服务及其实现: 存储库实现: 然后我的测试班: 当我运行它时,我有这个stacktrace,空指针: Session Session=sessionFactory.getCurrentSession() 堆栈跟踪: 现在它抛出这个堆栈跟踪:Java 配置Junit+;弹簧&x2B;冬眠4+;maven:Null指针获取会话,java,spring,hibernate,maven,junit,Java,Spring,Hibernate,Maven,Junit,我希望有人能帮助我。我是新手,现在真的很困惑。我用谷歌搜索了很多次,但我还是很困惑。 在经历了几个错误之后。。。我陷入了nullPointerException 我有一个服务及其实现: 存储库实现: 然后我的测试班: 当我运行它时,我有这个stacktrace,空指针: Session Session=sessionFactory.getCurrentSession() 堆栈跟踪: 现在它抛出这个堆栈跟踪: org.springframework.beans.factory.BeanCreat
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.myApp.repository.test.PollRepositoryTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.myApp.services.PollService com.myApp.repository.test.PollRepositoryTest.pollService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.myApp.services.PollService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:384)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:110)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:326)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:212)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
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.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:175)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.myApp.services.PollService com.myApp.repository.test.PollRepositoryTest.pollService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.myApp.services.PollService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
... 26 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.myApp.services.PollService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1100)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
... 28 more
这意味着我需要在applicationContext中创建bean?因为我喜欢放东西
在my appContext中,xml用于避免在xml中创建bean。
我希望你能在这个问题上帮助我。非常感谢您的回答。Session Session=sessionFactory.getCurrentSession()行在哪里代码>?如果它是一个简单的成员变量,那么它将在构造时执行。但是这些资源直到后来才被注入。因此,将该行移到一个用@Before注释的方法中
private Session session;
@Before
public void setUpSession() throws Exception {
session = sessionFactory.getCurrentSession();
}
为什么要扩展
AbstractTransactionalJUnit4SpringContextTests
我的典型测试(在测试spring mvc时)如下所示:
WebControllerTest.java
CustomerControllerTest.java
另外:我建议使用SpringBoot及其自动配置来启动并运行。让您可以使用spring,而无需第一次就将每个配置正确
春季的学习曲线相当陡峭(我自己也是初学者:)一般建议
Runner
vs扩展SpringContextTests
你什么时候使用runner
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@TransactionConfiguration
@Transactional
然后,不需要扩展AbstractTransactionalJUnit4SpringContextTests
注意:这个类(AbstractTransactionalJUnit4SpringContextTests
)只是为了方便扩展。如果您不希望您的测试类绑定到特定于Spring的类层次结构,您可以使用SpringJUnit4ClassRunner
、@ContextConfiguration
、@TestExecutionListeners
、@Transactional
等来配置您自己的自定义测试类
使用@Before实例化字段 字段应该在之前的
@内实例化,比如@Paul Hicks said或inplace,如果可能的话,在这里声明字段
@Resource
protected SessionFactory sessionFactory;
Session session;
@Before
public void setup(){
session = sessionFactory.getCurrentSession();
}
从SpringContextTests
此代码不是必需的
public PollRepositoryTest(){
super();
}
混合弹簧版本
不要在一个项目中混合使用spring版本
<artifactId>spring-expression</artifactId>
<version>4.0.0.RELEASE</version>
<artifactId>spring-beans</artifactId>
<version>3.2.1.RELEASE</version>
<artifactId>spring-test</artifactId>
<version>3.1.1.RELEASE</version>
spring表达式
4.0.0.0发布
春豆
3.2.1.1发布
弹簧试验
3.1.1.1发布
只使用一个版本,好主意是创建${spring.version}
属性。在一个类上同时使用@Controller(“PollService”)
和@Service没有任何意义,您应该只对dispatcher servlet中直接处理web请求的类使用@Controller
。顺便说一句,Paul Hicks是对的-在构建对象之前不可能注入任何东西。感谢您的评论Boris,我用您建议的更改更新了这个问题。你能再看一次吗?我还是有点困惑。致以最诚挚的问候。您的XML配置中是否有
以检测@Service
注释类?嗨,Boris Treukhov,我做到了,现在我收到了这个错误:创建名为“nameRepository”的bean时出错,该bean的实例化失败;嵌套异常为org.springframework.beans.BeanInstantiationException:无法实例化bean类[nameRepositoryImpl]:构造函数引发异常;嵌套的异常是java.lang.NoClassDefFoundError:javax/xml/rpc/encoding/Serializer我认为这是一个更深层次的错误,不是吗?请请求集成测试。谢谢Paul,我更新了这个问题并修复了类。你能看一下吗?我还是有点困惑,看起来像是一个全新的问题。第一个想法:你打开上下文扫描了吗?在哪里定义了组件扫描,并且正在扫描PollServiceImpl?旁白:避免使用大写字母的包裹名称。这可能会导致OSs和SCM的某些组合出现混乱和错误。
@Resource
protected SessionFactory sessionFactory;
private Session session;
@Before
public void setUpSession() throws Exception {
session = sessionFactory.getCurrentSession();
}
@Autowired
private PollService pollService;
@Rollback(true)
@Test
public void testSaveQuizPreference() throws Exception { /**...**/}
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.myApp.repository.test.PollRepositoryTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.myApp.services.PollService com.myApp.repository.test.PollRepositoryTest.pollService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.myApp.services.PollService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:384)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:110)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:326)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:212)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
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.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:175)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.myApp.services.PollService com.myApp.repository.test.PollRepositoryTest.pollService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.myApp.services.PollService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
... 26 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.myApp.services.PollService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1100)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
... 28 more
private Session session;
@Before
public void setUpSession() throws Exception {
session = sessionFactory.getCurrentSession();
}
import org.junit.Before;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import com.***.hkb.salesweb.Application;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public abstract class WebControllerTest {
@Autowired
CustomerController customerController;
protected MockMvc mockMvc;
@Autowired
WebApplicationContext wac;
@Before
public void setup() {
// Process mock annotations
MockitoAnnotations.initMocks(this);
// Setup Spring test in webapp-mode (same config as spring-boot)
this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
}
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import org.junit.Test;
public class CustomerControllerTest extends WebControllerTest {
@Test
public void testLoadCustomerPage() throws Exception{
this.mockMvc.perform(get("/customer")).andExpect(status().isOk());
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@TransactionConfiguration
@Transactional
@Resource
protected SessionFactory sessionFactory;
Session session;
@Before
public void setup(){
session = sessionFactory.getCurrentSession();
}
public PollRepositoryTest(){
super();
}
<artifactId>spring-expression</artifactId>
<version>4.0.0.RELEASE</version>
<artifactId>spring-beans</artifactId>
<version>3.2.1.RELEASE</version>
<artifactId>spring-test</artifactId>
<version>3.1.1.RELEASE</version>