我正在尝试编写单元测试,模拟使用GoMocks进行的服务调用,这真的是一件很艰难的事情。
我试图简化代码的一种方式是创建一个私有方法,为所有模拟调用提供良好的响应,然后在每个需要模拟调用的不同响应的单独测试中(例如,测试模拟失败),我希望用不同的响应覆盖该调用。
例如,setupMocks fn (已擦洗)
func setupMocks(s *SSAdapterV1Suite, userId string) {
s.mockDBDao.EXPECT().Mark(userId, gomock.Any()).
Return(nil)
s.mockDBDao.EXPECT().Get(userId).
Return(userData, nil)
s.mockDBDao.EXPECT().Delete(gomock.Any(), gomock.Any()).
Return(nil)
}
当我在“成功”场景中使用setupMocks fn时,它工作得很好。
然而,如果我试图在另一个单元测试中使用它,我想测试如何处理服务调用中的错误,gomocks将使用setupMocks fn中的mockResponse设置,而不是我想用来覆盖的设置。
我是否可以在GoMocks中调用或做些什么来用其他东西覆盖模拟的EXPECT()
响应,而不是附加callstack
发布于 2019-08-12 16:21:41
在提供此功能的GoMocks代码中,我确实没有看到任何类型的方法。
我看到的一种方式是,您可以手动操作gomock控制器中的callstack,以尝试获得您想要的东西。不过,这可能比它的价值更复杂。幸运的是,我发现了一种更简单的解决方法,可以查看此线程中的注释:https://github.com/golang/mock/issues/137#issuecomment-440370200
您可以做的是在调用setupMocks()之前调用您的重写。通过以相反的顺序进行覆盖,您将获得您想要的效果。
例如,
func (s *SSAdapterV1Suite) DeleteFails_Returns500() {
// Setup
req := makeRequest()
// Overrides need to go before setupMocks as a workaround for no mock override support.
// This may change in the future (c.f., https://github.com/golang/mock/issues/137#issuecomment-440370200)
expectedErrMsg := fmt.Errorf("Forced failure")
s.mockDBDao.EXPECT().
Delete(gomock.Any(), gomock.Any()).
Return(expectedErrMsg)
setupMocks(s, req.GetUserID())
// Run
resp, _ := s.server.RunTheThing(context.Background(), req)
// Assert
require.Equal(s.T(), int32(http.StatusInternalServerError), resp.GetStatus().GetCode())
require.Equal(s.T(), "", resp.GetStatus().GetError())
}
注创建模拟结构并将其连接到ctrl是在SetupTests() fn中完成的,并作为变量连接到SSAdapterV1Suite。
https://stackoverflow.com/questions/57464702
复制相似问题