我在用Gomockhttps://godoc.org/github.com/golang/mock和mockgen
此测试的源代码是:
package sqs
import (
"fmt"
"log"
"os"
"runtime"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/sqs"
"github.com/aws/aws-sdk-go/service/sqs/sqsiface"
)
var sess *session.Session
var svc *sqs.SQS
var queueURL string
func init() {
// Setting the runtime to run with max CPUs available
runtime.GOMAXPROCS(runtime.NumCPU())
sess = session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))
svc = sqs.New(sess)
queueURL = os.Getenv("QUEUE_URL")
}
type Poller interface {
Poll(chan bool)
}
// NewPoller is a factory to create a Poller object
func NewPoller(msgr Messenger) Poller {
p := &poller{
m: msgr,
}
return p
}
type poller struct {
m Messenger
}
func (p *poller) Poll(done chan bool) {
sqsMsgCh := make(chan *sqs.Message, 100)
for {
messages, err := p.m.GetMessage()
if err != nil {
log.Printf("error when getting message")
if len(messages) == 0 {
// Stop the system
log.Printf("I am here")
done <- true
}
}
for _, msg := range messages {
sqsMsgCh <- msg
}
}
}
type Messenger interface {
GetMessage() ([]*sqs.Message, error)
}
func NewMessenger() Messenger {
return &messenger{
s: svc,
}
}
type messenger struct {
s sqsiface.SQSAPI
}
func (m *messenger) GetMessage() ([]*sqs.Message, error) {
result, err := m.s.ReceiveMessage(&sqs.ReceiveMessageInput{
AttributeNames: []*string{
aws.String(sqs.MessageSystemAttributeNameSentTimestamp),
},
MessageAttributeNames: []*string{
aws.String(sqs.QueueAttributeNameAll),
},
QueueUrl: aws.String(queueURL),
MaxNumberOfMessages: aws.Int64(10),
VisibilityTimeout: aws.Int64(36000), // 10 hours
WaitTimeSeconds: aws.Int64(0),
})
if err != nil {
fmt.Println("Error", err)
return nil, err
}
msgs := result.Messages
if len(msgs) == 0 {
fmt.Println("Received no messages")
return msgs, err
}
return msgs, nil
}
此源文件的测试用例如下:
package sqs
import (
"errors"
"testing"
"path_to_the_mocks_package/mocks"
"github.com/golang/mock/gomock"
"github.com/aws/aws-sdk-go/service/sqs"
)
func TestPollWhenNoMessageOnQueue(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()
msgr := mocks.NewMockMessenger(mockCtrl)
mq := make([]*sqs.Message, 1)
err := errors.New("Mock Error")
// msgr.EXPECT().GetMessage().Return(mq, err) //.Times(1)
// msgr.GetMessage().Return(mq, err) //.Times(1)
msgr.EXPECT().GetMessage().Return(mq, err)
p := NewPoller(msgr)
done := make(chan bool)
go p.Poll(done)
<-done
t.Logf("Successfully done: %v", done)
}
当我运行测试时,我得到以下错误:
sqs\控制器。go:150:意外呼叫*mocks。嘲笑信使。GetMessage([])位于路径_至_mocks_package/mocks/mock_messenger。go:38因为:预期在路径_到_sqs_包/sqs/sqs_测试中调用。开始:35已经被称为最大次数。失败
如果我按照以下方式编写自己的模拟,测试用例将成功执行:
type mockMessenger struct {
mock.Mock
}
func (m *mockMessenger) GetMessage() ([]*sqs.Message, error) {
msgs := make([]*sqs.Message, 0)
err := errors.New("Error")
return msgs, err
}
你含蓄地告诉gomock你只期待一个电话。
msgr.EXPECT().GetMessage().Return(mq, err)
向模拟中添加多次,
,可以多次返回这些值。
msgr.EXPECT().GetMessage().Return(mq, err).AnyTimes()
我在一个项目上实现了一个简单的集成测试,但是失败了,因为预期()行在component.save()方法之前执行。当我把预期()行放在setTimeout()上时,它成功了。没有setTimeout()如何成功? spec.ts 错误:
我正在为Angular7模板中的函数编写单元测试用例。它是一个登录组件,登录功能在http请求中具有router.navigate,以便在正确登录时路由到仪表板。但是我得到了错误 - 错误:应使用[['/ProjectData/MasterSequence']]调用spy navigate,但从未调用过。堆叠(http://localhost:9876/absolute/home/hp/Downl
我想一次更新文档的所有选项卡。文档的信封是从一个模板创建的,该模板已经定义了收件人和选项卡,我使用以下负载调用这个endpoint来更新选项卡:
我正在尝试进行rest api调用,但一直收到。从日志中可以看出,我的POJO的字段之一似乎存在问题。 我的POJO: 在我的中 运行上述代码时,我得到以下错误:
我找到了一些很好的SO链接(如何从异步回调函数返回值?以及从node.js中的回调函数返回值等),但它们并不是不能为我的问题提供解决方案。 我的问题:能够得到异步调用的结果,但我如何使用这个结果返回我的函数? 这里获取callBackResponse的值为true或false,并希望将该值用作:
检查问题底部的更新 摘要:我有一个不是线性行为的数据集。我试图使用Spark的MLlib(V1.5.2)来拟合一个更像多项式函数的模型,但结果总是得到线性模型。我不知道是否不可能使用线性回归来获得非线性模型。 我正试图拟合一个模型,该模型能充分反映以下数据: 更新问题是由我们使用的spark和spark-ml库的版本引起的。出于某种原因,尽管我提供了更多的特性(输入数据的平方或立方版本),但版本1