gpt4 book ai didi

java - Mockito - Unmocked 方法无法返回对象本身

转载 作者:行者123 更新时间:2023-12-04 10:11:05 27 4
gpt4 key购买 nike

我有一个 Spring @RestController具有 Apache Camel 接口(interface)的字段 FluentProducerTemplate .

我正在使用 MockMvc 测试 Controller 我正在注入(inject) FluentProducerTemplate作为一个模拟。

我只想模拟一种方法 - request() ,并使用其他方法的真实实现。

但是,我得到 NullPointerException来自未模拟的方法。其他 FluentProducerTemplate方法 n ,它们的返回类型为 FluentProducerTemplate .在实现中,他们返回 this .模拟对象返回 null。

  • 我以为那个模仿 @Mock仅模拟我指定的方法。其他方法使用原始实现。这是一个正确的说法吗?
  • 我试过@Spy而不是 @Mock我得到了同样的错误。
  • 当我模拟我使用的所有方法时,它可以工作并且没有 NullPointerException .

  • 代码:

    REST Controller :
    @RestController
    @RequestMapping("/v1/test”)

    public class MyController {


    @EndpointInject(uri = "direct:main")
    private FluentProducerTemplate producerTemplate;

    @RequestMapping(value = “/test2”, method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public MyResponse testRequest(
    @RequestHeader(“id”) String id,
    @RequestHeader(“context”) String context,
    @RequestBody RequestBody requestBody
    ) {
    MyResponse response = producerTemplate
    .withHeader(“id”, id)
    .withHeader(“context”, context)
    .withBody(requestBody)
    .request(MyResponse.class);
    return response;
    }

    测试:
    @RunWith(MockitoJUnitRunner.class)
    public class MyControllerTest {

    private MockMvc mockMvc;

    @Mock
    private FluentProducerTemplate producerTemplateMock;

    @InjectMocks
    private MyControllerTest myController;

    private static MyResponse expectedResultSuccess;

    private static String requestString;

    private static HttpHeaders allRequestHeaders;

    @BeforeClass
    public static void setup() {

    allRequestHeaders = new HttpHeaders();
    allRequestHeaders.set(“id”, “123”);
    allRequestHeaders.set(“context”, “ABCD1234”);
    allRequestHeaders.set(“Content-Type”, “application/json”);

    expectedResultSuccess = new MyResponse(“test”);

    requestString = “request”BodyText;

    }

    @Before
    public void init() {

    mockMvc = MockMvcBuilders.standaloneSetup(myController).build();

    when(producerTemplateMock.request(any())).thenReturn(expectedResultSuccess);

    }

    @Test
    public void testSuccess() throws Exception {

    mockMvc.perform(post(“/v1/test/test2)
    .headers(allRequestHeaders)
    .content(requestString))
    .andExpect(status().isOk())

    }

    }

    仅当我将以下内容添加到 init() 时测试通过:
      when(producerTemplateMock.withHeader(any(), any())).thenReturn(producerTemplateMock);
    when(producerTemplateMock.withBody(any())).thenReturn(producerTemplateMock);

    我的主要问题是 - 为什么我必须模拟所有方法?
    我更喜欢使用 withHeader() 的原始实现和 withBody()仅模拟 request() .

    最佳答案

    你想要所谓的部分模拟。根据您是想主要设置模拟还是主要调用实际实现,有不同的首选方法。

    1. spy对于少数模拟,主要是真正的实现

    如果你只想模拟一些方法,否则调用真正的实现:

    FluentProducerTemplate producerTemplateMock = spy(FluentProducerTemplate.class);

    // Mock implementation
    doReturn(expectedResultSuccess).when(producerTemplateMock).request(any());

    // All other method call will use the real implementations

    2. mock对于大多数模拟,很少有真正的实现
    FluentProducerTemplate producerTemplateMock = mock(FluentProducerTemplate.class);

    // Mock methods
    when(producerTemplateMock.request(any())).thenReturn(expectedResultSuccess);

    // tell mockito to call the real methods
    when(producerTemplateMock.withHeader(any(), any())).thenCallRealMethod;
    when(producerTemplateMock.withBody(any())).thenCallRealMethod();

    如您所见,第二种方法是编写更多样板。但是,这取决于您的用例,哪种方法更适合。

    关于java - Mockito - Unmocked 方法无法返回对象本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61332999/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com