Aditya Sirohi
Aditya Sirohi

Reputation: 11

Keep getting nullpointerexception using Spring JPA derived query

My entity class looks like this

@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;

My Repository looks like this

public interface UserRepository extends CrudRepository<User, String>{
    User findByEmail(String email);
}

and I am using a Junit test like this

public class UserDAOTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    @Transactional
    public void validateUserTest1() {
        User u = userRepository.findByEmail("[email protected]");
        }

}

I have made this user class on my own after seeing something similar in class. However, I can't get this to work. Am I missing out on something here? I have tried a bunch of different things and googling this but can't find why I keep getting nullpointerexception.

The full stack trace looks like this from the junit test case.

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)

Upvotes: 1

Views: 87

Answers (1)

Steph
Steph

Reputation: 2049

By default, Junit test classes do not know of the spring context. Hence, in your code, the @Autowired annotation is disregarded and the userRepository remains null.

In order to have JUnit use the spring context you have to add annotations to your test class :

If you use spring boot and have a main configuration class:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { YourConfigurationClass.class })
public class UserDAOTest {
    ...

If you use xml context files:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/your-spring-config-file.xml")
public class UserDAOTest {
    ...

Upvotes: 1

Related Questions