我对Java、JUNIT和MACKITO还是个新手.我有一个非常简单的BookingManager级课程

package com.daydreamer.mocka;

import java.util.List;
import java.util.Arrays;

public class BookingManager {

    // Getters
    public List<Integer> getRoomsFromDb() {
        // Suppouse we are fetching data from database
        int[] roomInts = {1,2};
        List<Integer> rooms = Arrays.stream(roomInts).boxed().toList();
        return rooms;
    }

    public boolean getRoom(int ind) {
        List<Integer> rooms = this.getRoomsFromDb();
        return rooms.contains(ind);
    }

    // String represntation
    @Override
    public String toString() {
        String strRepr = "BookingManager {" +
       "}";
        return strRepr;
    }
}

以及其对应的测试类BookingManagerTest.

package com.daydreamer.mocka;

import java.util.List;
import java.util.ArrayList;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import com.daydreamer.mocka.BookingManager;

@DisplayName("Booking Manager Test")
public class BookingManagerTest {

     private BookingManager bm;

    @BeforeEach
    void init() {
        this.bm = Mockito.mock(BookingManager.class);
        List<Integer> rooms = new ArrayList<>();
        rooms.add(1);
        rooms.add(2);
        Mockito.when(this.bm.getRoomsFromDb()).thenReturn(rooms);
    }

    // Why this test is failing, please help !
    @Test
    @DisplayName("postive test")
    void testGetRoomPositive(){
        Assertions.assertTrue(this.bm.getRoom(1));
        Mockito.verify(this.bm, Mockito.times(1)).getRoom(1);
    }

    @Test
    @DisplayName("negative test")
    void testGetRoomNegative(){
        Assertions.assertFalse(this.bm.getRoom(5));
        Mockito.verify(this.bm, Mockito.times(1)).getRoom(5);
    }


}

然而,mock并没有像预期的那样工作.testGetRoomPositive应该返回true,但返回false.谁能让我知道我的错误.

干杯.

推荐答案

正如 comments 中所提到的,您不应该嘲笑您想要的类.

既然你嘲笑了你的目标班级.您可以通过以下方式解决此失败的测试用例:

when(bm.getRoom(anyInt())).thenCallRealMethod();  // Real implementation

它会再次在数据库上失败,你可以模拟你的数据库而不是真正的调用.这对于这个用例也是有意义的.

Java相关问答推荐

在Spring Boot中测试时出现SQL语法错误

如何使用CSS为选定但未聚焦的表格行设置背景 colored颜色 ?

Cosmos Change Feed Process Lag远远超过收集中的记录数量

Java应用程序崩溃时试图读取联系人从电话

JavaFX Maven Assembly插件一直打包到错误的JDK版本

在Spring Boot中使用哪个Java类来存储创建时间戳?

PDFBox未加载内容

如何在不删除Java中已有内容的情况下覆盖文件内容?

JFree Chart从图表中删除边框

如何在ImageIO或十二只猴子中旋转TIFF CMYK图像?

使IntelliJ在导入时优先 Select 一个类或将另一个标记为错误

使用MediaPlayer类在一段时间后停止播放音乐

Java递归泛型是否可以被视为继承和重写的语法糖

将基于实例编号的对象列表拆分为新的对象列表

如何使用Rascal Evaluator从编译的JAR访问Rascal函数?

ControlsFX RangeSlider在方向垂直时滞后

如何在更改分辨率时将鼠标坐标计算为世界坐标

Maven创建带有特定类的Spring Boot jar和普通jar

可以';不要在Intellij IDEA中使用最新的Java版本(JDK 21)

更新不可变的深层嵌套字段