Java 为什么我的Spring启动服务测试返回NullPointerException?
最近我一直在尝试测试我的SpringBoo(2.0.3)服务,但我收到了一个NullPointerException。userDAOImpl实现userDAO接口 下面是serviceImpl类,它实现了接口服务:Java 为什么我的Spring启动服务测试返回NullPointerException?,java,spring-boot,junit,Java,Spring Boot,Junit,最近我一直在尝试测试我的SpringBoo(2.0.3)服务,但我收到了一个NullPointerException。userDAOImpl实现userDAO接口 下面是serviceImpl类,它实现了接口服务: import app.clothapp.DAO.UserDAO; import app.clothapp.Model.User; import app.clothapp.Service.UserService; import org.apache.logging.log4j.LogM
import app.clothapp.DAO.UserDAO;
import app.clothapp.Model.User;
import app.clothapp.Service.UserService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
Logger logger = LogManager.getLogger("UserServiceImplLogger");
@Autowired
private UserDAO userDao;
@Override
@Transactional
public void createUser(User user) {
logger.debug("Creating an user " + UserServiceImpl.class.getName());
userDao.addUser(user);
}
@Override
public void deleteUserById(int id) {
logger.debug("Deleting an user " + UserServiceImpl.class.getName());
userDao.deleteUserById(id);
}
@Override
public List<User> getUsersByEmail(String email) {
logger.debug("Getting a list of users by email" + UserServiceImpl.class.getName());
return userDao.findUsersByEmail(email);
}
@Override
public void changeUserPassword(User user, String newPassword) {
logger.debug("Changing a user's password " + UserServiceImpl.class.getName());
userDao.changeUserPassword(user, newPassword);
}
@Override
public void changeUserFirstName(User user, String firstName) {
logger.debug("Changing an user's first name" + UserServiceImpl.class.getName());
userDao.changeUserFirstname(user, firstName);
}
@Override
public void changeUserLastname(User user, String lastname) {
logger.debug("Changing an user's last name" + UserServiceImpl.class.getName());
userDao.changeUserLastname(user, lastname);
}
@Override
public void changeUserEmail(User user, String email) {
logger.debug("Changing an user's email" + UserServiceImpl.class.getName());
userDao.changeUserEmail(user, email);
}
@Override
public List<User> findAllUsers() {
logger.debug("Finding all users" + UserServiceImpl.class.getName());
return userDao.findAllUsers();
}
}
}
如您所见,我使用UserFactory创建了一个用户,模拟jdbcTemplate和userDAOImpl,然后将它们注入UserServiceImpl()。然后在createUser()测试中,我使用服务创建用户,设置Mockito.when,并测试用户是否在数据库中
然而,我收到一个NullPointerException,尽管我不知道为什么。有人能给我一个提示吗
编辑:我现在收到一个NullInsteadOfMock错误,我必须实例化UserDAO对象,但是UserDAO是一个接口
org.mockito.exceptions.misusing.NullInsteadOfMockException:
Argument passed to when() is null!
Example of correct stubbing:
doThrow(new RuntimeException()).when(mock).someMethod();
Also, if you use @Mock annotation don't miss initMocks()
at app.clothapp.ServiceImpl.UserServiceTest.createUser(UserServiceTest.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:513)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:170)
at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:166)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:113)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:58)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:113)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$2(HierarchicalTestExecutor.java:121)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:121)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$2(HierarchicalTestExecutor.java:121)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:121)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:55)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:43)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:74)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
你的Mockito代码有点错误。与使用
new
实例化userserviceinpl
不同,您应该只使用InjectMocks
注释<应该模拟code>UserDao而不是UserDaoImpl
。在调用UserService.createUser
之前,应该将UserDao.createUser
的Mock设置为在调用时不执行任何操作。要使用需要使用的@Mock注释
@RunWith(MockitoJUnitRunner.class)
而不是
@RunWith(SpringJUnit4ClassRunner.class)
因此,您的模拟创建正确
在这方面:
@Mock
private JdbcTemplate jdbcTemplate = new JdbcTemplate();
您需要删除新的,因为您希望mockito创建和管理该类的模拟实例。像这样:
@Mock
private JdbcTemplate jdbcTemplate;
嗨,我收到了一个NullInsteadOfMockException。这可能是因为缺少@Autowire注释吗?
@Autowired
在模拟类中被忽略,在单元测试中被完全忽略。异常被抛出到哪里?嗨;你知道为什么我的doNothing().when()..@Octalc中当前说userDAO为null吗?因为你使用了错误的类来运行测试。重读我的答案并更改跑步者等级。
@Mock
private JdbcTemplate jdbcTemplate = new JdbcTemplate();
@Mock
private JdbcTemplate jdbcTemplate;