gpt4 book ai didi

java - 使用 SpringJUnit4ClassRunner 测试包含服务的 Controller 逻辑

转载 作者:行者123 更新时间:2023-11-28 21:35:34 26 4
gpt4 key购买 nike

我有一个关于使用 SpringJUnit4ClassRunner 进行测试的问题。

这是代码的简化版本。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= "/application-config-test.xml")
@WebAppConfiguration
public class TestControllerTest {

@Mock
private TestService testService;

@Autowired
TestDao TestDao;

private MockMvc mockMvc;

@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(new TestController()).build();
}

@Test
public void checkServerName() throws Exception{
TestServer testServer = new TestServer.TestServerBuilder()
.withHostName("test1")
.build();

when(testService.selectTestServer("test1")).thenReturn(testServer);
mockMvc.perform(get("/restapi/test/checkServerName")
.param("serverName", "test1"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(model().size(1))
.andExpect(model().attributeExists())
.andExpect(flash().attribute("message", "success"));
}
}

这是 config-test.xml 文件。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:websocket="http://www.springframework.org/schema/websocket"
xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.directwebremoting.org/schema/spring-dwr
http://www.directwebremoting.org/schema/spring-dwr-2.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.1.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd
http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

<mvc:annotation-driven />
<context:component-scan base-package="com.server.test"/>
<context:component-scan base-package="com.server.db.mybatis"/>
</beans>

Controller 逻辑

@GetMapping(value="/checkServerName")
public something checkServerName(@RequestParam (value="serverName")String serverName){
TestServer testServer = testService.selectTestServer(serverName);
if(edgeServer == null){
...
}else{
...
}
return something;
}

上面的测试失败,首先是因为testService为null。我想模拟一个服务,以便它用一个特定的对象来回答,即我制作的 testServer 。但不知何故它失败了,我试过 @MockBean @InjectMocks @Autowired 但都失败了。

我如何模拟此服务?假设我已经成功地模拟了这个服务 bean,那么 Autowiring 的 Controller 可以使用这个模拟的 bean 来执行它的逻辑吗?

最佳答案

controller中的testService是怎么定义的?

  • 如果它被定义为 @Autowired private TestService testService,您需要设置您的模拟 testService 而不是它(更简单的方法 - RelectionTestUtils.setField(controller, "testService", testService)
  • 如果在 Controller 的构造函数中(这是一种正确的方法 - Spring 坚持这样做)只需使用模拟 testService 在测试类中创建新的 Controller 。

之后您可以控制此testService 并测试您的逻辑。

关于java - 使用 SpringJUnit4ClassRunner 测试包含服务的 Controller 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59171988/

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