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 に答える