2016-03-15 81 views
0

我正在使用springMVC,我想测试我的服务,但我的@Mock存储库不工作,所以我永远不会得到我的用户,因为我的存储库为空,我该如何解决这个问题?我在注释中做错了什么?Spring模拟存储库不起作用

仓库接口:

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()); 

    } 

} 
+0

你知道什么是模拟吗?你嘲笑一个仓库,因为你*不希望它加载实现* –

+0

是的,男人!我的意思是我的服务模拟需要我的存储库,我无法嘲笑它,因为我得到了null。当我说加载我的意思是@Mock不是真正的加载,对于这种误解感到抱歉 – davidwillianx

+0

@davidwillianx不应该是'@Mock UserDao userRepository'而不是'@Mock UserRepository userRepository'? –

回答

7

我相信你错过了单元测试和嘲笑的整个想法。

  1. 当你单元测试你的UserService,你不希望使用真实UserRepository实施。
  2. 您嘲笑UserRepository,您不希望模拟对象立即表现为真实的对象。你需要弥补它的行为(又名桩)。
  3. 你应该很少需要在单元测试中使用Spring Runner。

为了确定模拟对象的行为,你必须知道你的系统下测试(SUT,这是UserService你的情况)和它的依赖(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"); 
    } 
} 
+0

+1你绝对正确,它可以帮助很多thx!我会检查出我关于模拟和测试的概念(thx !!) – davidwillianx

2

您也可以通过名称参数一样,

@MockBean(name="userRepository") 
UserDao userRepository;