【发布时间】:2020-03-18 09:52:56
【问题描述】:
我正在做我的第一个 Spring Boot 项目,但作为 Mockito 新手,我无法测试我的班级。 我需要检查下面的 findAndUpdateUser 方法是否正确更新了用户实体字段:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepo;
public User findUser(String id) {
return userRepo.findById(id);
}
public User findAndUpdateUser(String id) {
User foundUser = findUser(id);
//some update on foundUser fields
return foundUser;
}
}
为了测试,我需要模拟实体 bean,因为我在本地没有数据库。这是我的测试课:
@RunWith(MockitoJUnitRunner.class)
public class UpdateFieldsTest {
@Mock
private UserRepository userRepo;
@Test
public void test1() {
User user = new User();
user.setId("testId");
//setting some other user fields
Mockito.when(userRepo.findById("testId")).thenReturn(user);
UserServiceImpl userService = new userServiceImpl();
User returnedUser = userService.findAndUpdateUser("testId");
//Checking if user field values are updated after findAndUpdate call
Assert.xxx
//other asserts
}
}
但是这段代码在方法调用时给我抛出了一些 NullPointerException。我什至试图模拟 findUser 方法,但我仍然有错误......
我的方法不好吗?我应该如何测试我的方法?
欢迎任何帮助 谢谢大家
【问题讨论】:
-
1.完整的堆栈跟踪通常有助于调试 NPE。 2. 你永远不会感染那种依赖。您应该通过构造函数或设置器将
userRepo传递给userService。 -
您正在实例化
UserServiceImpl,它会自动连接UserRepository我想?你不能那样做。如果你不让框架处理你的服务被实例化的方式,通过@Autowired注解表达的DI将不起作用。可能是NPE的原因。 Mockito 提供了一些机制来处理带有模拟实例的 DI。你可以看看@InjectMocksf.ex. -
@Imaguest 是的。我将检查我不知道的 InjectMocks 注释。非常感谢!
标签: java spring mocking mockito