我们的web服务在他们的末端更新了。我使用Spring服务更新了我们的客户端代码。
问题是单元测试返回失败,因为注入的模拟WebServiceTemplate返回null。
我的问题是“有什么方法可以使返回的值具有预定义的价值吗?”
@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();
}
}发布于 2018-01-25 14:48:31
因为您没有将模拟的WebServiceTemplate注入到TheServiceClient。
你应该这样做
@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();
}
}您不需要配置类。
理想的方法是使用构造器注入代替字段注入。像这样
public class TheServiceClient {
private final WebServiceTemplate webServiceTemplate;
@Autowired
public TheServiceClient(final WebServiceTemplate webServiceTemplate) {
this.webServiceTemplate = webServiceTemplate;
}
.......
}然后,在您的测试类中而不是在InjectMocks中,您可以这样做
private TheServiceClient client;
@Mock
WebServiceTemplate webServiceTemplate;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
client = new TheServiceClient(webServiceTemplate);
.............
}
................https://stackoverflow.com/questions/48445368
复制相似问题