当前位置: 首页 > 知识库问答 >
问题:

使用mockito模拟autowired字段在rest调用中会产生空响应

上官树
2023-03-14

我用的是弹簧靴和摩基托。我自动连接了一个类,即BDSRequest,在Junit测试类中,我使用了@Spy和@InjectMocks注释。但是在Junits中调用rest服务时,我得到的响应(bdsCustomerHoldings)为null,断言失败。如何在没有模拟rest模板(如mockito.when(restTemplate.PostForObject(constants.bds_rest_url,bdsRequest、BdsCustomerHoldings.class)的情况下测试此rest调用

class BDSRestCall
{

    @Autowired
    BDSRequest bdsRequest;

    public BDSCustomerHoldings getBDSCustomerInfo(String channelId, String customerId, String cinSuffix,
            String countryCode) {

        logger.info("prepareRequestForBDS");
        Header header = new Header();
        header.setMsgId(RandomStringUtils.randomAlphanumeric(20));
        header.setChannelId(channelId);
        header.setCountryCode(countryCode);
        header.setRecordTimeStamp(DateTimeFormatter.ofPattern(Constants.DATE_FORMATTER).format(LocalDateTime.now()));

        TxnRequest txnRequest = new TxnRequest();
        txnRequest.setIdDoc(customerId);
        txnRequest.setIdDocSuffix(cinSuffix);
        txnRequest.setIdDoctype("");
        txnRequest.setInsurerCode("");

        bdsRequest.setHeader(header);
        bdsRequest.setTxnRequest(txnRequest);

        logger.info("BDS request " + bdsRequest);

        BDSCustomerHoldings bdsResponse = restTemplate.postForObject(Constants.BDS_REST_URL, bdsRequest,
                BDSCustomerHoldings.class);
        logger.info("BDS Response : " + bdsResponse);

        return bdsResponse;
    }
}
@RunWith(MockitoJUnitRunner.class)
class BDSRestCallTest
{
    @InjectMocks
    private BDSRestCall bdsRestCall;

    @Mock
    private RestTemplate restTemplate;

    @Spy
    private BDSRequest bdsRequest;



    @Test
        public void getBDSCustomerInfoExceptionTest() {
            BDSCustomerHoldings bdsCustomerHoldings = bdsRestCall.getBDSCustomerInfo("SG", "S9718016D",
                    "00", "SG");
            System.out.println("response is " + bdsCustomerHoldings);
            assertNotNull("response is not null", bdsCustomerHoldings);
        }

}

共有1个答案

薛烨
2023-03-14

由于我们正在使用@RunWith(MockitoJUnitRunner.class),那么我们应该使用如下所示的模拟restTemplate的响应

Mockito.when(restTemplate.postForObject(Mockito.anyString(), bdsRequest, BDSCustomerInsuranceHoldings.class)).thenReturn(sampleBDSCustomerInsuranceHoldings());

然后它会给出模拟响应。

 类似资料:
  • 我使用的是Spring3.1.4.Release和Mockito1.9.5。在我的春季课上,我有: 我想为我的“Defaulturl”字段模拟一个值。请注意,我不想模拟其他字段的值--我希望保持这些字段的原样,只保留“Defaulturl”字段。还要注意,我的类中没有显式的“setter”方法(例如),我不想仅仅为了测试的目的创建任何方法。 既然如此,我如何模拟一个字段的值呢?

  • 问题内容: 我正在尝试编写一个JUnit测试用例,用于测试助手类中的方法。该方法使用REST调用外部应用程序,而这正是我试图在JUnit测试中模拟的调用。 helper方法使用Spring的RestTemplate进行REST调用。 在测试中,我创建了一个模拟REST服务器和一个模拟REST模板,并按如下所示实例化它们: 然后,我给模拟服务器添加种子,以便当助手方法进行REST调用时它应返回适当的

  • 基类 在派生类中不应用组合和其他函数。如果是,我是否应用了错误的模式?我应该如何处理相同的?

  • 我正在为我的服务层编写单元测试。我的服务层有多个自动生成的字段。我想只模拟其中一个和其他初始化为自动驾驶。 服务接口 服务实现 测试类 我只想嘲笑productRepository字段,但不想嘲笑productManager 问题是productManager 是否可以自动初始化它们?就像它们在运行带有完全加载的上下文的Spring引导应用程序时被初始化一样。

  • 我从单元测试开始。我对一个类做了更改,在这个类中我不注入SessionContext,这样我就可以在需要时进行查找。 现在,在我的测试中,我想注入它,这样我就可以模拟查找方法: 我觉得很奇怪,因为我拥有所需的所有依赖项(这段代码在真实的应用程序中工作)。 如何使用mockito模拟和注入SessionContext?(我无法改变嘲讽框架)。

  • 问题内容: 我有四个让我们说A,B,C,D的类,每个类都从另一个调用方法。 现在我已经模拟了类A,并且想模拟使用嘲笑的方法 并希望在递归方法调用上获取“ foo” 应该回来 我试过了 when(a.getB()。getC()。getD())。thenReturn(“ foo”); 但是得到了nullPointerException 然后我尝试 doReturn(“ foo”)。when(a.get