2

我正在使用 Groovy 1.8.6 和 Grails 2.1.1

我有一个界面

public interface Searchable{
    Long docVersion()
}

由对象实现

class Book implements Searchable {
    Long docVersion() {
        System.currentTimeMillis() / 1000L
    }

    String otherMethod() {
        "toto"
    }
}

和一个测试

@Mock([Book])
class SomeBookTester {
    @Before
    void setup() {
        Book.metaclass.docVersion = {-> 12345}
        Book.metaclass.otherMethod = {-> "xyz"}
    }

    @Test
    void test1() {
        assert 12345 == new Book().docVersion()
    }

    @Test
    void test2() {
        assert "xyz" == new Book().otherMethod()
    }
}

第一次测试总是失败,因为方法替换不起作用。我该如何解决这个问题?有什么问题?

4

2 回答 2

2

您最好使用适当的 GrailsMock 设施。你可以试试这个:

@Mock([Book])
class SomeBookTester {
    @Before
    void setup() {
        def mockBook = mockFor(Book)
        mockBook.demand.docVersion(0..1)  { -> 12345 }
        mockBook.demand.otherMethod(0..1) { -> "xyz" }
        Book.metaClass.constructor =  { -> mockBook.createMock() }
    }

    @Test
    void test1() {
        assert 12345 == new Book().docVersion()
    }

    @Test
    void test2() {
        assert "xyz" == new Book().otherMethod()
    }
}
于 2013-01-27T07:08:08.067 回答
1

这对我有用

我像这样改变班级:

class Book implements Searchable {
    Long docVersion() {
        currentTime()
    }

    Long currentTime() {
        System.currentTimeMillis() / 1000L
    }

    String otherMethod() {
        "toto"
    }
}

并且在测试中,我替换了currentTime方法

@Mock([Book])
class SomeBookTester {
    @Before
    void setup() {
        Book.metaclass.currentTime= {-> 12345}
        Book.metaclass.otherMethod = {-> "xyz"}
    }

    @Test
    void test1() {
        assert 12345 == new Book().docVersion()
    }

    @Test
    void test2() {
        assert "xyz" == new Book().otherMethod()
    }
}

测试通过

于 2013-01-27T14:33:58.023 回答