Java Mockito未在测试中模拟来自控制器的函数

Java Mockito未在测试中模拟来自控制器的函数,java,testing,mockito,micronaut,Java,Testing,Mockito,Micronaut,我试图模拟控制器调用的方法,如图所示: @Post(value = "/blah", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON) @Transactional public HttpResponse<Object> createBlah(HttpHeaders httpHeaders, @Body @Valid CreateBlahR

我试图模拟控制器调用的方法,如图所示:

@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);

    }
@Post(value=“/blah”,products=MediaType.APPLICATION\u JSON,consumes=MediaType.APPLICATION\u JSON)
@交易的
公共HttpResponse createBlah(HttpHeaders HttpHeaders,
@正文@Valid CreateBlahRequest CreateBlahRequest){
HttpResponse createBlahResponse;
(...)
createBlahService(…)//我想嘲弄的是什么
返回HttpUtils.getResponse(HttpStatus.CREATED,createBlahResponse.body());
}
在我的测试中,我测试如下所示:

@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);

    }
@Mock
公共BlahController BlahController;
public HttpResponse resp=HttpResponse.created((对象)new AccountResponse()).status(HttpStatus.OK);
@以前
public void configureAppContext(){
Application.Application\u CONTEXT=applicationContext;
initMocks(this);
}
@试验
void createBlah(){
可变HttpRequest请求=HttpRequest
.POST(“/blah”,createBlahRequest)
.标题(“请求ID”、“1”);
当(blahController.createBlah(eq(request.getHeaders())、eq(createBlahRequest))。然后返回(resp);
HttpResponse blahRes=client.toBlocking().exchange(请求,CreateBlahRequest.class);
}

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

对于任何看到这一点的人,我必须注入该方法调用的类。 在控制器中,它调用另一个服务类,因此我对其进行了如下模拟:

@Inject
public BlahService BlahService;

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

它运行得很好。

您没有向我们显示足够的代码来计算答案。我看不到
client
在测试中是如何实例化的,也看不到createBlah是如何调用的(我假设在客户端的某个地方),client只是一个RxHttpClient,createBlah是从调用控制器的客户端调用的,该控制器具有与createBlahand
createBlahRequest
匹配的特定路径?我不确定您的意图是什么,但看起来您试图做的是完全忽略真正的控制器,在这种情况下,您的测试将不会测试除了测试本身中的代码之外的任何代码。这就是你的意图吗?@JeffScottBrown目的是测试控制器的端点调用是否有效。我想模拟其中一个方法的行为,因为它调用一个我想模拟的外部API。我只是想测试端点命中这肯定比问题中描述的最初尝试更有意义。最初的尝试是试图模拟控制器,在这种情况下,除了模拟本身之外,您不会测试任何东西。当然,很抱歉造成混淆,我保护了太多的源代码,将对其进行编辑,以便让下一位读者更清楚地了解它