【问题标题】:How to used Mockito for restTemplateBuilder in Spring Boot如何在 Spring Boot 中将 Mockito 用于 restTemplateBuilder
【发布时间】:2021-11-30 12:07:54
【问题描述】:

我有一个弹簧休息消费者如下。

在这个服务中,我们需要使用另一个自动连接的服务。

如何模拟restTemplate 的响应?

@Service
public class TestConsumer {

    private final RestTemplate restTemplate;
    
    @Autowired
    private AccountService accountService;
    
    public TestConsumer(RestTemplateBuilder restTemplateBuilder) {
        restTemplate = restTemplateBuilder.basicAuthentication("username", "password")
                .rootUri("https://example.com").build();
    }
    
    public String testGet() {
        
        Account account = accountService.getAccount();
        String r = "";
        if("Admin".equals(account.getType())) {
            r = restTemplate.getForObject("AAA", String.class);
        }else {
            r = restTemplate.getForObject("BBB", String.class);
        }
        return r;
    }
}

【问题讨论】:

    标签: spring-boot mockito spring-resttemplate


    【解决方案1】:

    我建议您也将AccountService 设为构造函数参数,以便更轻松地测试您的类:

    @Service
    public class TestConsumer {
    
        private final RestTemplate restTemplate;
        
        private AccountService accountService;
        
        public TestConsumer(RestTemplateBuilder restTemplateBuilder, AccountService accountService) {
            restTemplate = restTemplateBuilder.basicAuthentication("username", "password")
                    .rootUri("https://example.com").build();
            this.accountService = accountService;
        }
        
        public String testGet() {
            
            Account account = accountService.getAccount();
            String r = "";
            if("Admin".equals(account.getType())) {
                r = restTemplate.getForObject("AAA", String.class);
            }else {
                r = restTemplate.getForObject("BBB", String.class);
            }
            return r;
        }
    }    
    

    然后我将同时模拟RestTemplateBuilderRestTemplate,如下所示:

    public class TestConsumerTest {
    
        @Mock
        private RestTemplate restTemplate;
    
        @Mock
        private RestTemplateBuilder restTemplateBuilder;
    
        @Mock
        private AccountService accountService;
    
        private TestConsumer testConsumer;
    
        @BeforeEach
        public void setUp() {
            MockitoAnnotations.initMocks(this);
    
            // Mock RestTemplateBuilder behaviour
            doReturn(this.restTemplateBuilder).when(this.restTemplateBuilder).basicAuthentication(anyString(), anyString());
            doReturn(this.restTemplateBuilder).when(this.restTemplateBuilder).rootUri(anyString());
            doReturn(this.restTemplate).when(this.restTemplateBuilder).build();
    
            // Mock RestTemplate behaviour
            doReturn("whatever-string").when(this.restTemplate).getForObject(eq("AAA"), eq(String.class));
            doReturn("whatever-another-string").when(this.restTemplate).getForObject(eq("BBB"), eq(String.class));
            
            this.testConsumer = new TestConsumer(restTemplateBuilder, accountService);
        }
    
        // Your tests
    }    
    

    【讨论】:

    • 一个好主意!在构造函数中注入所有依赖项,然后模拟它:)
    猜你喜欢
    • 1970-01-01
    • 2022-07-10
    • 1970-01-01
    • 2019-11-16
    • 2020-09-17
    • 2018-01-22
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    相关资源
    最近更新 更多