当前位置: 首页 > 面试题库 >

模拟的存储库返回null

孙永思
2023-03-14
问题内容

我正在使用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());

    }

}

问题答案:

我相信您错过了单元测试和模拟的整个想法。

  1. 在对进行单元测试时UserService,您不想使用实际的UserRepository实现。
  2. UserRepository模拟了一个,您不希望模拟对象立即表现出真实的对象。您需要弥补其行为(即存根)。
  3. 您几乎不需要在单元测试中使用Spring Runner。

为了确定模拟对象的行为,您必须了解被测系统(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输出将执行以下操作: 知道为什么响应是空的吗?我为测试使用了正确的注释,因此应该注入模拟。也许我在这里