gpt4 book ai didi

java - JUnit |模拟服务器|休息模板

转载 作者:行者123 更新时间:2023-12-01 16:23:19 24 4
gpt4 key购买 nike

我有一个名为 PostService 的服务,它具有名为 connectionManager Autowired 的实例变量。

在这个connectionManager内部有一个名为restTemplate Autowired的实例变量。

在配置java文件中,使用一些逻辑创建RestTemplate对象。

当我围绕它编写一个测试用例,并使用预期的 URL 和 post 方法创建一个 MockRestServiceServer 时,作为返回,期望得到带有某些正文的响应。当我执行测试用例时,我没有从这个 mockedRestServiceServer 得到模拟响应。

据我所知,这是因为在测试执行期间,创建了剩余模板的真实对象,并且模拟服务器不用于发送模拟响应。

有人可以帮助我,如何克服这个问题吗?

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);
}
}
}

最佳答案

您正在创建 RestTemplate 的实例,但未使用它。 MockRestServiceServer 在做什么?我还可以看到 @Resource@Autowired 的使用错误,您不应在测试中指定它们。尝试使用@MockBean

Autowiring 的作用是将您在测试中创建的资源注入(inject)到真实的类中,而不是相反。

我将在此处添加一些示例代码,这可能会帮助您实现目标。

@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"))));

}

关于java - JUnit |模拟服务器|休息模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62212396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com