gpt4 book ai didi

java - 从测试用例调用 Controller 时,使用自动连线组件测试 Controller 为空

转载 作者:行者123 更新时间:2023-12-05 09:19:39 26 4
gpt4 key购买 nike

我有一个 Controller

@RestController
public class Create {

@Autowired
private ComponentThatDoesSomething something;

@RequestMapping("/greeting")
public String call() {
something.updateCounter();
return "Hello World " + something.getCounter();
}

}

我有那个 Controller 的组件

@Component
public class ComponentThatDoesSomething {
private int counter = 0;

public void updateCounter () {
counter++;
}

public int getCounter() {
return counter;
}
}

我还对我的 Controller 进行了测试。

@RunWith(SpringRunner.class)
@SpringBootTest
public class ForumsApplicationTests {

@Test
public void contextLoads() {
Create subject = new Create();
subject.call();
subject.call();
assertEquals(subject.call(), "Hello World 2");
}

}

当 Controller 调用 something.updateCounter() 时测试失败。我得到一个 NullPointerException。虽然我知道可以将 @Autowired 添加到构造函数中,但我想知道是否可以使用 @Autowired 字段来执行此操作。如何确保 @Autowired 字段注释在我的测试中有效?

最佳答案

Spring 不会自动连接您的组件,因为您使用 new 而不是 Spring 实例化您的 Controller ,因此组件未实例化

SpringMockMvc 测试检查它是否正确:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class CreateTest {
@Autowired
private WebApplicationContext context;

private MockMvc mvc;

@Before
public void setup() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.build();
}

@Test
public void testCall() throws Exception {
//increment first time
this.mvc.perform(get("/greeting"))
.andExpect(status().isOk());
//increment secont time and get response to check
String contentAsString = this.mvc.perform(get("/greeting"))
.andExpect(status().isOk()).andReturn()
.getResponse().getContentAsString();
assertEquals("Hello World 2", contentAsString);
}
}

关于java - 从测试用例调用 Controller 时,使用自动连线组件测试 Controller 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39892534/

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