Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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 模拟存储库返回null_Java_Unit Testing_Spring Mvc_Mockito - Fatal编程技术网

Java 模拟存储库返回null

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

我使用的是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.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
    ,您不希望模拟对象立即表现为真实对象。你需要弥补它的行为(又名存根)
  • 您应该很少需要在单元测试中使用SpringRunner 为了确定模拟对象的行为,您必须知道被测系统的预期交互(SUT,在您的情况下是
    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;