我有一个名为PostService的服务,它的实例变量名为connectionManager Autowired。
在这个connectionManager中有一个实例变量,名为restTemplate Autowired.
在配置java文件中,用一定的逻辑创建RestTemplate的对象。
当我围绕一个测试用例编写测试用例时,创建一个带有预期的MockRestServiceServer和post方法的,作为回报,期望得到某个主体的响应。当我执行一个测试用例时,我不会得到来自这个mockedRestServiceServer**.**的模拟响应
同样,我可以感觉到,这是因为在测试执行期间,创建了一个真正的rest模板对象,并且没有使用模拟服务器发送模拟响应。
有人能帮我吗,怎么克服呢?
class PostServie {
@Autowired
private ConnectionManager connectionManager;
public void postMessage(String msg) {
// some logic
}
}@Component
class ConnectionManager {
@Autowired
private RestTemplate restTemplate;
public String getToken(){
ResponseEntity<String> response = this.restTemplate.postForEntity(url, request, String.class);
//returns response.body() in string format
}
}@Configuration
class Configuration {
@Bean
public RestTemplate getRestTemplate(){
// some logic and returns object of RestTemplate
}
}@RunWith(SpringRunner.class)
class PostServiceTest {
@Autowired
private PostMessageService postMessageService;
@Resource(name="authServerRestTemplet")
private RestTemplate authServerRestTemplet;
private MockRestServiceServer mockedAuthServerRestTemplet;
private final String requestToAuthServer ="grant_type=client_credentials&client_id=ceapiClientId";
@Before
public void setUp() {
mockedAuthServerRestTemplet =
MockRestServiceServer.createServer(authServerRestTemplet);
}
@Test
public void postServeiceSuccess () {
mockedAuthServerRestTemplet.expect(requestTo(ACCESS_TOKEN_URI)).andExpect(content().string(requestToAuthServer)).andExpect(method(HttpMethod.POST)).andRespond(withSuccess("{abc : 'abc'}", MediaType.APPLICATION_JSON));
postMessageService.postMessage(jsonMessage);
}
}
}发布于 2020-06-05 09:57:19
您正在创建一个RestTemplate实例,但不使用它。MockRestServiceServer在做什么?我还可以看到对@Resource和@Autowired的错误使用,您不应该在测试中指定它们。尝试使用@MockBean。
自动装配工作,以便您在测试中创建的资源被注入到实际的类中,而不是反过来。
我将在这里添加一些示例代码,这些代码可能会帮助您实现目标。
@RunWith(SpringRunner.class)
@WebMvcTest
public abstract class AbstractControllerTest {
@Autowired
protected MockMvc mockMvc;
@MockBean
protected Service service;
@Before
public void setUp() {
Mockito.reset(service);
}
}然后你的测试
public class YourTest extends AbstractControllerTest {
@Test
public void shouldDoSomething() throws Exception {
// given
List<someStuff> stuff = new ArrayList<>();
stuff.add(new Whatever("content", "John Smith");
// when - service is in the abstract controller!
when(service.getSomething()).thenReturn(stuff);
// then
mockMvc.perform(get("/posts/1/whatever").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$[0].content", is("content")))
.andExpect(jsonPath("$[0].author", is("John Smith"))));
}https://stackoverflow.com/questions/62212396
复制相似问题