Использование mockgen в режиме отражения

Я пытаюсь написать несколько тестов для существующей библиотеки, но не могу заставить работать gomock

Я хотел бы проверить поведение в случае сбоя rand.Read. Вот пример того, что я хотел бы проверить. Я хотел бы видеть строку log.Error, выполняющуюся в тесте

import (
     "crypto/rand"
)
    func GetRandomBytes(n int) ([]byte, error) {

        b := make([]byte, n)
        _, err := rand.Read(b)

        if err != nil {
            log.Error("Failed to get entropy from system", err)
            return nil, err
        }

        return b, nil
    }

Система gomock должна позволить мне заставить вызов rand.Read делать правильные вещи

Однако я не могу заставить инструмент mockgen работать в режиме "отражения"

$ $GOPATH/bin/mockgen 'crypto/rand' Read
# command-line-arguments
./prog.go:22:28: invalid indirect of "crypto/rand".Read (type func([]byte) (int, error))
2018/01/21 11:20:30 Loading input failed: exit status 2

Я использую go версию go1.9.2 linux/amd64 на Ubuntu 14.04

genmock -prog_only 'crypto/rand' Read работает нормально, но генерируемый им код не выглядит полезным для того, что мне нужно сделать

1 ответ

У меня недавно была такая же задача. Также пытался издеваться, но, наконец, сделать по-другому.

Вы можете сделать функцию принятия Read функция и возвращение вашей целевой функции GetRandomBytes, Подобно:

func MakeRandomBytesGetter(fn func([]byte) (int,error)) func(int)([]bute,error) {
    return func(n int) ([]byte, error) {

        b := make([]byte, n)
        _, err := fn(b)

        if err != nil {
            log.Error("Failed to get entropy from system", err)
            return nil, err
        }

        return b, nil
    }
}

var (
    GetRamdomBytes = MakeRandomBytesGetter(rand.Read)
)

Для тестов вы можете использовать разные функции с одной и той же сигнатурой, но с другим поведением. Подобно:

func FailRead(n int) ([]byte, error) {
    return []byte{}, fmt.Errorf("Read failed")
}

И проверьте поведение вашей функции, когда он получает такие ошибки.

Другие вопросы по тегам