我正在使用springMVC,我想测试我的服务,但是我的@Mock存储库不起作用,所以我永远也不会得到我的用户,因为我的存储库为空,如何解决此问题?我在注释中做错了吗?
仓库接口:
package br.com.api.model.data;
import br.com.api.model.resources.User;
import java.util.List;
public interface UserDao {
User findByLoginAndPassword(String login, String password);
List<User> listAll();
}
存储库实现:
package br.com.api.model.repository;
import br.com.api.model.data.UserDao;
import br.com.api.model.resources.User;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.List;
@Repository
public class UserRepository implements UserDao {
public User findByLoginAndPassword(String login, String password) {
System.out.println("lets find:");
User userMatch = new User();
List<User> users = usersMockup();
for (User user : users) {
if(user.getLogin().equals(login)
&& user.getPassword().equals(password)){
userMatch = user;
}
}
return userMatch;
}
public List<User> listAll() {
List<User> users = usersMockup();
return users;
}
private List<User> usersMockup(){
List<User> users = new ArrayList<User>();
User first = new User();
first.setLogin("first");
first.setPassword("teste");
User scnd = new User();
scnd.setLogin("second");
scnd.setPassword("teste");
users.add(first);
users.add(scnd);
return users;
}
}
这是我的服务:
package br.com.api.model.services;
import br.com.api.model.data.UserDao;
import br.com.api.model.resources.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserDao userRepository;
public User findUser(String login, String password) {
User userMatch;
userMatch = userRepository.findByLoginAndPassword(login, password);
return userMatch;
}
}
这是我的测试:
package br.com.api.model.services;
import br.com.api.model.repository.UserRepository;
import br.com.api.model.resources.User;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.mockito.Mock;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.mockito.Mockito.when;
@RunWith(SpringJUnit4ClassRunner.class)
public class UserServiceTest {
@Mock
UserDao userRepository;
@InjectMocks
UserService userService;
@Before
public void setUp(){
MockitoAnnotations.initMocks(this);
}
@Test
public void findUser(){
User user;
user = userService.findUser("first", "teste");
assertNotNull(user.getLogin());
}
}
我相信您错过了单元测试和模拟的整个想法。
UserService
,您不想使用实际的UserRepository
实现。 UserRepository
模拟了一个,您不希望模拟对象立即表现出真实的对象。您需要弥补其行为(即存根)。为了确定模拟对象的行为,您必须了解被测系统(UserService
在您的情况下为SUT )及其依赖项(UserRepository
)的预期交互作用。
在您的情况下,测试应该看起来像(尚未编译,只是向您展示想法)
public class UserServiceTest {
@InjectMocks
UserService userService;
@Mock
UserDao mockUserRepository;
@Before
public void setUp(){
MockitoAnnotations.initMocks(this);
}
@Test
public void testFindUser(){
// Given
User dummyUser = new User();
when(mockUserRepository.findByLoginAndPassword(anyString(), anyString()).thenReturn(dummyUser);
// When
User result = userService.findUser("first", "teste");
// Then
// you are expecting service to return whatever returned by repo
assertThat("result", result, is(sameInstance(dummUser)));
// you are expecting repo to be called once with correct param
verify(mockUserRepository).findByLoginAndPassword("first", "teste");
}
}
我试图测试一个服务方法,但为了做到这一点,我必须模拟我的ReportRepository。除了对Include方法的调用使模拟返回为NULL外,其他操作都很好。 下面返回预期的报告: 但该服务实际上执行以下操作: 问题是,当我在模拟中包含'include'方法时,返回的是null而不是预期的报告,因此我的测试以:
这是我要测试的类 这是测试类 当我做这个测试的时候 我创建这些类时参考了其他已有的代码,来自不同的地方,并且没有真正理解如何进行注释(部分原因是时间不够),所以如果有人能告诉我,不仅是如何修复,而且还有为什么我错了,我会非常感激的! 编辑: 我做了@Nikolas Charalambidis建议的更改(谢谢!),所以我的类现在看起来与 通过稍加搜索,从这个SO答案中,我觉得我不应该@autowir
我已经创建了一个包含控制器、服务和存储库层的基本Rest API。我现在正在尝试为通过产品ID查找产品的服务层方法编写一个单元测试。但是,当我运行测试时,它会在我试图模拟存储库findById()方法的行中抛出一个NullPointerException。 服务层中的getProductById()方法如下所示: 我的服务层测试类:
我有下面的课,我试图测试。我遇到问题的方法是,因为我试图存根/模拟行为,然后在测试中验证行为。
此示例存储库有一个方法 现在不需要使用Robolectric来单元测试了吗?
现在,当调用“/comments/1”时,我得到了404个错误,所以数据rest没有公开我的存储库。主要问题是“如何模拟存储库方法从数据库中获取数据?” 我的测试类: 据我所知,使用MockBean注释我替换了当前的存储库bean并且它不会被数据rest公开,我们有没有办法将数据预填充到db或存储库方法的模拟调用?
我试图获取一个列表从数据库和findAll()返回空列表。我有多个jpa存储库,但只有一个不工作。这是代码: 这就是实体: 当我调用product类别epository.findAll()时,它返回空列表,因此我在数据库中有许多条目。谢谢你的帮助!
我试图测试一个简单POST Rest调用,但存在NullPointerException。 我的RestController: 我的单元测试: 由于以下错误,此测试失败:NullPointerException,确切地说,response ResponseEntity对象为Null。 verify输出将执行以下操作: 知道为什么响应是空的吗?我为测试使用了正确的注释,因此应该注入模拟。也许我在这里