Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的Spring启动服务测试返回NullPointerException?_Java_Spring Boot_Junit - Fatal编程技术网

Java 为什么我的Spring启动服务测试返回NullPointerException?

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

最近我一直在尝试测试我的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.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;