问题描述
我的实体类如下
@Entity
public class User {
@Id
@Column(length = 50)
private String email;
@Column(length = 50,nullable=false)
private String name;
@Column(length = 50,nullable=false)
private String password;
我的存储库看起来像这样
public interface UserRepository extends CrudRepository<User,String>{
User findByEmail(String email);
}
我正在使用像这样的Junit测试
public class UserDAOTest {
@Autowired
private UserRepository userRepository;
@Test
@Transactional
public void validateUserTest1() {
User u = userRepository.findByEmail("jim.gordon@gmail.com");
}
}
在看到类中的相似内容后,我自己创建了该用户类。但是,我无法使它正常工作。我在这里错过了什么吗?我尝试了很多不同的方法并进行了谷歌搜索,但是找不到为什么我不断得到nullpointerexception的原因。
在junit测试用例中,完整的堆栈跟踪看起来像这样。
java.lang.NullPointerException
at com.BarShelf.tests.UserDAOTest.validateUserTest1(UserDAOTest.java:22)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
解决方法
默认情况下,Junit测试类不了解spring上下文。因此,在您的代码中,@Autowired
注释将被忽略,而userRepository
仍为空。
为了使JUnit使用spring上下文,您必须在测试类中添加注释:
如果您使用spring boot并具有主要配置类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { YourConfigurationClass.class })
public class UserDAOTest {
...
如果您使用xml上下文文件:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/your-spring-config-file.xml")
public class UserDAOTest {
...