当前位置: 首页 > 知识库问答 >
问题:

简单的JUnit测试失败

扶文光
2023-03-14

我想学习如何编写JUnit测试,但我完全失败了。

这是我的测试:

    @Test
    public void testGetAllCustomers() {
        // given
        List<Customer> customerList = new ArrayList<Customer>();
        customerList.add(c1);
        customerList.add(c2);
        customerList.add(c3);
        given(customerRepository.findAll()).willReturn(customerList);
            
        // when
        List<Customer> resultList = customerService.getAllCustomers();
        
        // then
        assertThat(resultList).hasSize(3);
    }

问题是这个简单的断言已经失败了。返回的列表是空的。我知道,我对这一切都不熟悉,但是从我的角度来看,失败是如此出乎意料,以至于我没有办法解决这个问题。

以下是全部代码(不太多):

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;

import java.sql.Timestamp;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class CustomerServiceTests {
    
    @Mock
    private CustomerRepository customerRepository;
    
    @InjectMocks
    private CustomerService customerService;
    
    private Customer c1 = new Customer(
            1L, 
            "Hans Meyer", 
            false, 
            Timestamp.from(Instant.now()),
            null,
            null
    );
    private Customer c2 = new Customer(
            2L, 
            "Marie Hollande", 
            true, 
            Timestamp.from(Instant.now()),
            null,
            null
    );
    private Customer c3 = new Customer(
            3L, 
            "Mohammed Abbas", 
            false, 
            Timestamp.from(Instant.now()),
            null,
            null
    );
    
    @Before
    public void setUp() {
        MockitoAnnotations.openMocks(this);
    }

    @Test
    public void testGetAllCustomers() {
        // given
        List<Customer> customerList = new ArrayList<Customer>();
        customerList.add(c1);
        customerList.add(c2);
        customerList.add(c3);
        given(customerRepository.findAll()).willReturn(customerList);
        
        // when
        List<Customer> resultList = customerService.getAllCustomers();
        
        // then
        assertThat(resultList).hasSize(3);
    }
}

要测试的功能就是这个,我知道它是有效的:

public List<Customer> getAllCustomers() {
        return customerRepository.findAll();
}

实际上,我只是想学习如何编写这样的测试,但是几天来我一直没有写出来。有相当多的例子和解释,但是不管我做什么尝试,我都还没有管理一个工作测试。如何为getAllClient()创建一个工作测试?谢谢你的帮助!

共有1个答案

马淳
2023-03-14

您需要初始化模拟两次,首先是通过@RunWith(MockitoJUnitRunner.class)初始化,然后是通过MockitoAnnotations初始化。openMocks(这个)

这意味着当您输入setUp方法时:

  • customerRepository指向R1

在这种方法之后

  • customerRepository指向R2

也就是说你的服务没有重新初始化

使用调试器确认此观察结果。

@Mocks javadoc说:

MockitoAnnotations.openMocks(此)方法必须被调用来初始化带注释的对象。在上面的例子中,openMocks()在测试的基类的@之前(JUnit4)方法中被调用。对于JUnit3,openMocks()可以转到基类的安装()方法。相反,您也可以将openMocks()放在JUnit运行程序(@RunBy)中,或者使用内置的MockitoJUnitRunner。

 类似资料:
  • 我认为自己是单元测试的新手,对McCito和JUnit完全陌生。我必须为一些简单的api调用编写单元测试。但我的测试对我来说似乎有点毫无意义,我不知道我哪里出了问题。我向现有的web服务ManagerWS添加了一个方法。java,见下文。 经理。java方法: 逻辑很简单。构造url,创建标头并将标头添加到请求中。发出请求并从响应中提取状态代码。这是我的测试。注意:类使用@RunAnd(Sprin

  • 我不熟悉匕首。我创建了一个非常简单的单元测试,试图理解我应该如何使用dagger。不幸的是,它失败了。我可能还不了解匕首的一些基本原理。 而我的测试课失败了 我认为dagger会将B注入A,因为A希望注入B,DaggerModule包含一个@Providers注释方法,该方法创建B。 更新: 我发现当我像这样编写模块类时 将B注入A作品中。然而,我不理解为什么当模块有一个构造a实例的带注释的方法时

  • 我正在尝试从spring启动应用程序中的服务执行JUnit4测试,并且我一直使用init获取entityManagerFactory。 我还希望使用我的应用程序连接。属性文件,但它希望使用嵌入式hsqldb进行连接。 有人能给我指出正确的方向吗? 以下是相关代码: 应用特性: 主要内容: 实体: DAO/存储库: 服务: 测试: 本应包括以下内容: 堆叠:

  • 我有一个简单的测试用例: FileManager中的函数删除 /myDir下的所有文件,然后再次保留文件。 如上所述,我有一个。运行时,我可以按以下顺序查看所有打印: 但是,测试在失败。有两件事我不明白: > 我不明白,它在中失败了,为什么我仍然可以看到打印的,听起来就像是失败了,它没有停止运行,而是继续运行下一个测试?JUnit测试用例中的场景背后发生了什么?? 我不明白的另一件事是为什么tes

  • 我正在为我的RESTAPIendpoint编写JUnit,我已经为它创建了一个简单的hello world控制器类和JUnit,但是我在执行JUnit测试用例时遇到了以下异常。如果有人能帮我解决这个问题,那将非常有帮助。我在Spring4.3版本中使用JDK6 注意:我没有使用spring上下文XML—我使用的是Java注释 你好ontroller.java HelloControlllerTes