【问题标题】:How to test a service that get data from a database using JUnit and Mockito如何使用 JUnit 和 Mockito 测试从数据库中获取数据的服务
【发布时间】:2017-08-22 19:57:32
【问题描述】:

我编写了一个从数据库获取数据的 java 服务:

public List<Operation> listOperations(String code){

//some business logic...

}

我使用来自我的数据库listOperations("CEA1"); 的代码手动测试了该服务,它工作正常,它返回给我一个包含 3 个操作对象的列表(我的数据库中的结果相同)。

现在我想使用 Mockito 和 JUnit 测试我的服务,但我是单元测试的初学者(但我知道单元测试的概念是什么,模拟......),

这是我未完成的测试课:

@RunWith(MockitoJUnitRunner.class)
public class MyserviceTest {

    @Mock
    private OperationRepository  operationRepositoryMock;


    @InjectMocks
    private BanqueServiceImpl banqueServiceImpl;

    @Before
    public void setup() {
      MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testListOfOperation(){

        String code = "CEA1";

        //to check if my service is working good ,the code 'CEA1' should return a list with 3 Operation object
        when(operationRepositoryMock.listOperations(code)). // i dont know how to mock the result


boolean result = banqueServiceImpl.listOperations(code); // i don't know how to assert that the service return a list that contains 3 Operation object

        //assertTrue(result);
    }

请任何人帮助我完成我的测试代码,请注意我正在从事 Spring Boot 项目。

问候!

【问题讨论】:

  • 如果您的服务返回列表,那么您为什么要将结果分配给boolean
  • @JakubCh。这只是一个小错误,因为复制了代码的 sn-p
  • 您能向我们解释一下listOperations 方法执行的功能吗?了解该方法的作用应该有助于我们确定如何测试它。例如,如果它只是简单地调用数据访问方法并返回从数据库中检索到的数据,那么,您根本不应该费心对其进行单元测试!
  • 在考虑如何编写测试之前,花点时间考虑一下测试用例应该尝试验证什么

标签: java spring-boot junit mockito


【解决方案1】:

首先准备你的行动清单

Operation sampleOperation = new Operation();
List<Operation> operationList = new ArrayList<Operation>();
operationList.add(sampleOperation);

现在使用 mockito 在调用 listOperations() 方法时返回 operationList

when(operationRepositoryMock.listOperations(eq("CEA1"))).thenReturn(operationList);

现在您可以使用断言来验证列表的大小或验证列表的内容

assertThat("size is equal to 1", banqueServiceImpl.listOperations(code).size(), is(1));

【讨论】:

  • @want2leam 感谢您的时间和回复,但我还有一个问题,我知道该服务应该返回一个包含 3 个对象的列表,所以我尝试使用:assertThat("size is equal to 3", banqueServiceImpl.listOperations(code).size(), is(3)); 但测试是失败并显示以下消息:预期是 但是 这是否意味着我应该将 3 个对象添加到我准备好的列表“operationList”中?如果是,我想知道我有一个服务,它返回一个包含 200 个对象的列表,我应该准备一个包含这个对象数量的列表(非常困难)?请向我澄清这一点。最好的问候
  • 如果你用 3 断言,是的,你必须准备 3 个对象并添加到列表中。你应该知道 operationRepositoryMock 是一个模拟而不是一个真实的对象,在这里你正在测试方法的行为,所以你不必准备 200 个对象并添加到列表中。
  • 非常感谢,我明白我在行为和结果之间感到困惑..,你是最棒的
  • 因此,如果您认为这是正确答案,您可以将我的答案标记为正确答案并点赞。谢谢
猜你喜欢
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 2015-02-19
  • 2019-07-16
  • 2020-10-07
  • 1970-01-01
相关资源
最近更新 更多