gpt4 book ai didi

java - 使用 Spring Autowiring 时创建 bean

转载 作者:行者123 更新时间:2023-12-02 12:41:02 25 4
gpt4 key购买 nike

我正在尝试为我的 Controller 编写测试。当网络服务运行时,一切正常。但是,当我运行测试时,我得到:

创建名为“Controller”的 bean 时出错:通过字段“service”表达的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用的“com.prov.Service”类型的合格 bean:预计至少有 1 个有资格作为 Autowiring 候选者的 bean。依赖注释:{@org.springframework.beans.factory.annotation.Autowired(required=true)}

正如您在下面看到的,我相信所有内容都已正确自动连接,并且我的项目结构已正确设置,以便组件扫描器可以正确找到注释,但我仍然收到此错误。

Controller :

@RestController
@RequestMapping("/api")
public class Controller {

@Autowired
private Service service;

@JsonView(Views.All.class)
@RequestMapping(value = "/prov/users", method = RequestMethod.POST)
@ResponseBody
public CommonWebResponse<String> handleRequest(@RequestBody UserData userData) {
return service.prov(userData);
}
}

服务:

@Service
public class Service {

@Autowired
private Repo repo;

@Autowired
private OtherService otherService;

public CommonWebResponse<String> prov(UserData userData) {
// do stuff here
return new SuccessWebResponse<>("Status");
}
}

Controller 测试:

@RunWith(SpringRunner.class)
@WebMvcTest(
controllers = Controller.class,
excludeFilters = {
@ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
value = {CorsFilter.class, AuthenticationFilter.class}
)
}
)
@AutoConfigureMockMvc(secure = false)
public class ControllerTest {

public static final MediaType APPLICATION_JSON_UTF8 = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));

@Autowired
private MockMvc mvc;

@Test
public void connectToEndpoint_shouldReturnTrue() {
UserData userData = new UserData("a", "bunch", "of", "fields");
try {
mvc.perform(post("/api/prov/users").contentType(APPLICATION_JSON_UTF8)
.content(asJsonString(userData))
.accept(MediaType.ALL))
.andExpect(status().isOk());
} catch (Exception e) {
Assert.fail();
}
}

}

最佳答案

Controller 类 Autowiring 您的 Service 类。因此,测试 Controller 类需要存在 Service 类,因为 Controller 依赖于创建 Service 类型的 bean。这意味着您要么必须将您的服务类@Autowired添加到测试中,要么(最好)使用Mockito之类的东西来模拟它。 .

(使用代码示例进行编辑):

@RunWith(SpringRunner.class)
@WebMvcTest(Controller.class)
public class ControllerTest {
@MockBean
private Service service

@Autowired
private MockMvc mvc;

@Test
public void foo() {
String somePayload = "Hello, World";
String myParams = "foo";
when(service.method(myParams)).thenReturn(somePayload);
mvc.perform(get("my/url/to/test").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$", is(equalTo("Hello, World"))));
}
}

请注意,此示例使用 Hamcrest 来实现 is()equalTo()

关于java - 使用 Spring Autowiring 时创建 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44937760/

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