java - 具有命令和查询方法的对象应该是模拟的还是 stub 的?

标签 java spock

我有一个问题。

我有一个依赖于其他 DAO 对象的类。 DAO对象包含两种方法:命令方法和查询方法。我想要测试的方法调用这两种方法。

我应该模拟这个对象或 stub 吗?

我将向您展示我的测试的外观。

class RentServiceTest extends Specification {
Map<Integer, Room> rooms = new HashMap<Integer, Room>();

def setup() {
    rooms.put(1, new Room(1));
    rooms.put(2, new Room(2));
    rooms.put(3, new Room(3));
    rooms.put(4, new Room(4));
}

def "it should rent concrete room" () {
    given:
        RoomDAO roomDAOMock = Mock();
        RentService rentService = new RentServiceImpl(roomDAOMock);
    when:   
        roomDAOMock.getRooms() >> rooms;
        rentService.rentRoom(2);
    then:   
        1* roomDAOMock.editRoom(_);
        roomDAOMock.getRooms() == rooms;                    
    }
}

测试失败,因为 getRooms 方法返回 null;

最佳答案

以下测试工作得很好:

@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
@Grab('cglib:cglib-nodep:3.1')

import spock.lang.*

class RentServiceTest extends Specification {
    Map<Integer, Room> rooms = new HashMap<Integer, Room>();

    def setup() {
        rooms.put(1, new Room(1));
        rooms.put(2, new Room(2));
        rooms.put(3, new Room(3));
        rooms.put(4, new Room(4));
    }

    def "it should rent concrete room" () {
        given:
            RoomDAO roomDAOMock = Mock()
            RentService rentService = new RentServiceImpl(roomDAOMock)
        when:   
            roomDAOMock.getRooms() >> rooms
            rentService.rentRoom(2)
        then:   
            1 * roomDAOMock.editRoom(_)
    }
}

class Room {
    Room(int number) {}
}

class RoomDAO {
    def editRoom(int number) {
    }
}

interface RentService {

}

class RentServiceImpl implements RentService {

    RoomDAO dao

    RentServiceImpl(RoomDAO dao) {
        this.dao = dao
    }

    def rentRoom(int number) {
        dao.editRoom(number)
    }
}

一般来说,您应该使用Mock

关于java - 具有命令和查询方法的对象应该是模拟的还是 stub 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28938078/

相关文章:

java - 如何在 Camunda-bpm 中使用流程变量?

grails - Grails、Geb 和 PhantomJS 的功能测试不起作用

java - 在 Spock 测试中使用 @Client 在 Micronaut 中进行 HTTP 分段文件上传

mocking - 在 Spock 中模拟最后一个类

grails - 对象未保存在Spock集成测试中

java - org.json.JSONException) org.json.JSONException : JSONObject ["routes"] not found

java - 使用字符串与字节[]作为值,映射中的内存使用情况

spring - grailsApplicaiton如何在Grails Spock单元测试中初始化?

java - 有人可以在程序的帮助下解释哈希表冲突是如何发生的吗?

java - 滞后套接字java