Golang测试中Error Missing call(s)的问题如何解决

Golang测试中Error Missing call(s)的问题如何解决 我正在尝试使用 go/mock 模拟服务层来测试我的处理程序层。 运行测试时出现以下错误 image

以下是我进行模拟的方式:

mockBehavior: func(s *mock_service.MockUploader, ctx context.Context, data model.Data) {
			s.EXPECT().XMLFinesService(ctx, data)
		}

以及 Run 函数:

for _, testCase := range testTable {
		t.Run(testCase.name, func(t *testing.T) {
			// Init
			ctrl := gomock.NewController(t)

			cfg := &config.Config{}

			upload := mock_service.NewMockUploader(ctrl)
			testCase.mockBehavior(upload, testCase.inputContext, testCase.inputData)

			services := &service.Services{Uploader: upload}
			handler := NewHandlers(services, cfg)

			// Test server
			e := echo.New()
			e.POST("/uploadXML", handler.Upload.UploadXMLFines()) 

			// Test request
			w := httptest.NewRecorder()
			req := httptest.NewRequest("POST", "/uploadXML", bytes.NewBufferString(testCase.inputBody))

			// Perform request
			e.ServeHTTP(w, req)

			// Assert
			assert.Equal(t, testCase.expectedStatusCode, w.Code)
			assert.Equal(t, testCase.expectedRequestBody, w.Body.String())
		})
	}

更多关于Golang测试中Error Missing call(s)的问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang测试中Error Missing call(s)的问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这个错误表明你声明的模拟期望没有被调用。在 mockBehavior 中你设置了 s.EXPECT().XMLFinesService(ctx, data),但测试执行时这个方法没有被调用。

问题通常出现在以下几个方面:

  1. 方法签名不匹配:检查实际调用的方法参数是否与模拟期望完全一致
  2. 方法没有被调用:确认你的处理程序确实调用了 XMLFinesService 方法
  3. 上下文或参数差异:检查传入的 ctxdata 参数是否完全匹配

以下是修正后的示例:

// 确保在 mockBehavior 中添加返回值(如果方法有返回值)
mockBehavior: func(s *mock_service.MockUploader, ctx context.Context, data model.Data) {
    // 如果 XMLFinesService 有返回值,需要在这里指定
    s.EXPECT().XMLFinesService(ctx, data).Return(expectedResult, expectedError)
}

// 或者在方法没有返回值时使用 Any() 来匹配参数
mockBehavior: func(s *mock_service.MockUploader, ctx context.Context, data model.Data) {
    s.EXPECT().XMLFinesService(gomock.Any(), gomock.Any())
}

// 更精确的参数匹配
mockBehavior: func(s *mock_service.MockUploader, ctx context.Context, data model.Data) {
    s.EXPECT().XMLFinesService(
        gomock.Eq(ctx),
        gomock.AssignableToTypeOf(model.Data{}),
    ).Times(1) // 明确指定调用次数
}

检查你的处理程序实现,确保它确实调用了 services.Uploader.XMLFinesService() 方法:

func (h *Handlers) UploadXMLFines() echo.HandlerFunc {
    return func(c echo.Context) error {
        // 解析请求数据
        var data model.Data
        if err := c.Bind(&data); err != nil {
            return c.JSON(http.StatusBadRequest, err.Error())
        }
        
        // 确保这里调用了模拟的方法
        result, err := h.services.Uploader.XMLFinesService(c.Request().Context(), data)
        if err != nil {
            return c.JSON(http.StatusInternalServerError, err.Error())
        }
        
        return c.JSON(http.StatusOK, result)
    }
}

在测试中添加调试信息来确认方法是否被调用:

// 在测试中添加验证
defer ctrl.Finish() // 确保在测试结束时验证所有期望

// 或者使用 defer ctrl.Finish() 来确保所有期望都被验证
t.Run(testCase.name, func(t *testing.T) {
    ctrl := gomock.NewController(t)
    defer ctrl.Finish() // 这会验证所有期望是否被满足
    
    // ... 其余测试代码
})

如果问题仍然存在,检查 testCase.inputData 和实际处理程序解析的数据是否完全一致,包括所有字段的值和类型。

回到顶部