我有一个问题。

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

我应该嘲笑这个对象还是存根?

我将向您展示我的测试情况。

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

10-07 18:53
查看更多