Java 模拟存储库返回null
我使用的是springMVC,我想测试我的服务,但我的@Mock存储库不工作,所以我永远无法获取我的用户,因为我的存储库为空,我如何解决这个问题?我在注释中是否做错了什么 存储库接口:Java 模拟存储库返回null,java,unit-testing,spring-mvc,mockito,Java,Unit Testing,Spring Mvc,Mockito,我使用的是springMVC,我想测试我的服务,但我的@Mock存储库不工作,所以我永远无法获取我的用户,因为我的存储库为空,我如何解决这个问题?我在注释中是否做错了什么 存储库接口: package br.com.api.model.data; import br.com.api.model.resources.User; import java.util.List; public interface UserDao { User findByLoginAndPassword(S
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.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
)及其依赖项(UserRepository
)
在您的情况下,测试应该如下所示(尚未编译,只需向您展示想法)
还可以传递名称参数,如
@MockBean(name="userRepository")
UserDao userRepository;
您需要修改模拟的顺序,首先应该使用@InjectMocks,然后使用@Mock,在添加测试类名之前 @ExtendWith(MockitoExtension.class)
我也面临同样的问题,但在实施了上述步骤后,它对我起了作用你知道什么是模拟吗?你嘲笑一个存储库,因为你不想让它加载实现!我的意思是我的服务模拟需要我的存储库,我不能模拟它,因为我得到了null。当我说加载时,我是指@Mock not real loading,很抱歉出现这种情况misunderstanding@davidwillianx它不应该是
@Mock UserDao userRepository
而不是@Mock userRepository userRepository
?对不起,我发布了错误的版本,我已经设置了这个想法。很抱歉我没有在我的测试用例中工作,但是我的项目工作了。你说的“@Mock not real loading”是什么意思?+1你完全正确,它帮助了很多thx!我会检查一下我关于模拟和测试的概念(thx!!)你可以用@RunWith(MockitoJUnitRunner.class)注释类来替换@Before public void setUp(){MockitoAnnotations.initMocks(this);}如果我还没有实现UserDao实现的类,比如使用Autowire
d存储库怎么办(接口存储库)在我的存储库中使用@Mock之后,在我的服务(sut)上方添加@injectmock,这是为我修复的+1双重答案,Vedant
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());
}
}
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");
}
}
@MockBean(name="userRepository")
UserDao userRepository;