Goのgenmockでmockを生成するMakefileを生成するツールを作った
テストを書くときにはMockを生成したくなる
しかしコードが増えてくるとmockを生成し直すのでも大変
というわけでバッシュでシュッと作りましたkeroxp.icon2019/2/1
こういう、mock化したいファイルのリストを作ります
code:mock_list.txt
api.go
handler_*.go
github.com/aws/aws-sdk-go/service/s3/s3iface/interface.go
これはシェルスクリプトのワイルドカード記法が使えます
このファイルの解決方法は、
現在からの相対パスで探す
vendor以下の相対パスで探す
の二段階です。$GOPATHからは探しません
ワイルドカードでマッチしても_test.goで終わるファイルはmock化しません
こういうシェルスクリプトを置きます
code:mockmake.sh
# (c) 2019 Yusuke Sakurai, MIT License
mkdir -p mocks
ret=mock.make
echo "all: _all"
list=${1:-mock_list.txt}
all=""
for l in $(cat ${list});
do
dir=$(dirname ${l})
base=$(basename ${l})
mockbase="mocks"
if -e "${l}" ;then
file="${l}"
elif -e "./vendor/${l}" ; then
file="./vendor/${l}"
else
file=${l}
fi
glob=$(ls ${file})
exit $?
fi
for f in ${glob};
do
if ! -e ${f} ;then
echo "not found: ${f}"
exit 1
fi
if ${f} =~ _test.go ;then
continue
fi
dir=$(dirname ${l})
base=$(basename ${l})
task="${mockbase}/${dir}/mock_${base}"
mkdir -p ${mockbase}
all+=" ${task}"
echo -e "${task}: ${file}"
echo -e "\tmkdir -p ${mockbase}/${dir}"
echo -e "\tmockgen -source ${file} > ${mockbase}/${dir}/mock_${base}"
done
done
echo -e "_all: ${all}"
echo -e "clean:"
echo -e "\trm -rf mocks/*"
実行します
code:bash
$ ./mockmake.sh
するとこんな感じのMakefileが出力されます
code:log
all: _all
mocks/github.com/aws/aws-sdk-go/service/s3/s3iface/mock_interface.go: ./vendor/github.com/aws/aws-sdk-go/service/s3/s3iface/interface.go
mkdir -p mocks/github.com/aws/aws-sdk-go/service/s3/s3iface
mockgen -source ./vendor/github.com/aws/aws-sdk-go/service/s3/s3iface/interface.go > mocks/github.com/aws/aws-sdk-go/service/s3/s3iface/mock_interface.go
mocks/./mock_api.go: api.go
mkdir -p mocks/.
mockgen -source api.go > mocks/./mock_api.go
mocks/./mock_handler_xxx.go: handler_xxx.go
mkdir -p mocks/.
mockgen -source handler_xxx.go > mocks/./mock_handler_xxx.go
mocks/./mock_handler_yyy.go: handler_yyy.go
mkdir -p mocks/.
mockgen -source handler_yyy.go > mocks/./mock_handler_yyy.go
clean:
rm -rf mocks/*
これを保存してmakeすると、
code:txt
mocks/
github.com/....
s3iface/
mock_interface.go
mock_api.go
mock_handler_xxx.go
mock_handler.yyy.go
のようにmocksディレクトリに必要なmockファイルがすべて生成されます
Makefileで生成しているので、元ファイルの変更に応じてビルドされたりされなかったりします
Makefileを生成するというのはCMakeから着想を得ました