【问题标题】:Mockito not mocking function from controller in testMockito 在测试中没有从控制器模拟功能
【发布时间】:2020-02-12 19:40:25
【问题描述】:

我正在尝试模拟我的控制器调用的方法,如下所示:

@Post(value = "/blah", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
    @Transactional
    public HttpResponse<Object> createBlah(HttpHeaders httpHeaders,
            @Body @Valid CreateBlahRequest createBlahRequest) {
        HttpResponse<Object> createBlahResponse;

        (...)
        createBlahService(...) // what i am trying to mock

        return HttpUtils.getResponse(HttpStatus.CREATED, createBlahResponse.body());
    }

在我的测试中,我正在测试如下:

    @Mock
    public BlahController blahController;

    public HttpResponse<Object> resp = HttpResponse.created((Object) new AccountResponse()).status(HttpStatus.OK);

    @BeforeAll
    public void configureAppContext() {
        Application.APPLICATION_CONTEXT = applicationContext;
        MockitoAnnotations.initMocks(this);
    }

@Test
    void createBlah(){

        MutableHttpRequest<CreateBlahRequest> request = HttpRequest
                .POST("/blah", createBlahRequest)
                .header("requestId", "1");

        when(blahController.createBlah(eq(request.getHeaders()), eq(createBlahRequest))).thenReturn(resp);

        HttpResponse<CreateBlahRequest> blahRes = client.toBlocking().exchange(request, CreateBlahRequest.class);

    }

但是,当客户端调用控制器时,它似乎与我的测试中的 (when) 不匹配,它继续按原样运行。如果有人可以就此提供一些建议,将不胜感激。

【问题讨论】:

  • 您没有向我们展示足够的代码来找出答案。我看不到 client 在测试中是如何被实例化的,我也看不到 createBlah 是如何被调用的(我假设在客户端某处)
  • client只是一个RxHttpClient,createBlah是从client调用controller调用的,具体路径匹配createBlah
  • 我不确定你的意图是什么,但看起来你想要做的是将真正的控制器完全排除在外,在这种情况下你的测试不会测试你的任何代码来自测试本身的代码。这是你的意图吗?
  • @JeffScottBrown 的目的是测试控制器的端点调用是否有效。我想模拟其中方法的行为,因为它调用了我想模拟的外部 API。我只是想测试端点命中

标签: java testing mockito micronaut


【解决方案1】:

对于看到这一点的任何人,我必须注入该方法调用的类。 在控制器中它调用了另一个服务类,所以我像这样模拟它:

@Inject
public BlahService BlahService;

@MockBean(BlahService.class)
public BlahService blahService(){
    return Mockito.mock(BlahService.class);
}

效果很好。

【讨论】:

  • 这绝对比问题中描述的原始尝试更有意义。最初的尝试是尝试模拟控制器,在这种情况下,除了模拟本身之外,您不会测试任何东西。
  • 很抱歉造成混乱,我保护了太多的源代码将进行编辑,以便下一个读者更清楚
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
相关资源
最近更新 更多