首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >注入模拟Spring WebServiceTemplate以返回预定义值

注入模拟Spring WebServiceTemplate以返回预定义值
EN

Stack Overflow用户
提问于 2018-01-25 14:35:08
回答 1查看 5.2K关注 0票数 2

我们的web服务在他们的末端更新了。我使用Spring服务更新了我们的客户端代码。

问题是单元测试返回失败,因为注入的模拟WebServiceTemplate返回null。

我的问题是“有什么方法可以使返回的值具有预定义的价值吗?”

代码语言:javascript
复制
@Configuration
public class TestConfig {
    @Bean
    public WebServiceTemplate webServiceTemplate() {
        WebServiceTemplate webServiceTemplate = mock(WebServiceTemplate.class);
        return webServiceTemplate;
    }

    @Bean
    public TheServiceClient client() {
        return new TheServiceClient();
    }

}

public class TheServiceClient {
    @Autowired
    private WebServiceTemplate webServiceTemplate;

    public TheResponse getResponse(TheRequest request) {
        // logic handles the request need to be tested
        JAXBElement<?> element = (JAXBElement<?>) webServiceTemplate.marshalSendAndReceive(request);
        return element.getResponse();
    }
}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
public class IdalClientTest {
    @Autowired
    private TheServiceClient client;

    @Test
    public void testGetResponse() {
        TheRequest request = new TheRequest();
        request.setters();

        TheResponse response = client.getResponse(request);
        assertThat(response.getSucess()).isTrue();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-25 14:48:31

因为您没有将模拟的WebServiceTemplate注入到TheServiceClient。

你应该这样做

代码语言:javascript
复制
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
public class IdalClientTest {

    @InjectMocks
    private TheServiceClient client;

    @Mock
    WebServiceTemplate webServiceTemplate;

    @Mock
    JAXBElement jaxBElement;

    @Before
     public void setUp() {
        MockitoAnnotations.initMocks(this);
        when(webServiceTemplate.marshalSendAndReceive(any(TheRequest.class))).thenReturn(jaxBElement);
     // You can create a TheResponse object with success = true;          
   when(jaxBElement.getResponse()).thenReturn(dummyTheResponseObject);

    }
    @Test
    public void testGetResponse() {
        TheRequest request = new TheRequest();
        request.setters();

        TheResponse response = client.getResponse(request);
        assertThat(response.getSucess()).isTrue();
    }
}

您不需要配置类。

理想的方法是使用构造器注入代替字段注入。像这样

代码语言:javascript
复制
public class TheServiceClient {

private final WebServiceTemplate webServiceTemplate;

@Autowired
public TheServiceClient(final WebServiceTemplate webServiceTemplate) {
    this.webServiceTemplate = webServiceTemplate;  
 }
    .......
}

然后,在您的测试类中而不是在InjectMocks中,您可以这样做

代码语言:javascript
复制
private TheServiceClient client;

@Mock
WebServiceTemplate webServiceTemplate;


@Before
 public void setUp() {
    MockitoAnnotations.initMocks(this);
    client = new TheServiceClient(webServiceTemplate);
       .............
}
 ................
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48445368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档