[英]Bean Type not being found in in Spring Test package
因此,这是当前对错误的描述给我的信息。
描述:
Field profileDoa in com.N2O2.Nitrouz_Studioz.controller.MainController required a bean of type 'com.N2O2.Nitrouz_Studioz.model.profile.ProfileDoa' that could not be found. 注入点有以下注解: - @org.springframework.beans.factory.annotation.Autowired(required=true)
行动:
考虑在您的配置中定义“com.N2O2.Nitrouz_Studioz.model.profile.ProfileDoa”类型的 bean。
我有点不知道为什么会发生这个错误,因为我最近只使用 Java Spring Boot 并且仍然习惯于使用 Beans。 我已经在测试 class 中自动连接了 Bean,但它仍然抛出相同的错误。
这是我在测试 class 和 Controller 和 ProfileDoa class 中的内容。
@WebMvcTest(MainController.class)
@ContextConfiguration(classes = NitrouzStudiozApplication.class)
public class MainControllerTest {
@Autowired
private MockMvc mockMvc;
ProfileEntity profileEntity;
@Autowired
private ProfileDoa profileDoa;
private MainController mainController;
@Mock
private Model model;
private boolean loggedOut = true;
private boolean loggedIn = false;
@BeforeEach
public void intializeController(){
mainController = new MainController();
}
@Test
@DisplayName("Navigating to Website Correctly Displays Index page")
public void loadsIndexPage() throws Exception {
RequestBuilder request = MockMvcRequestBuilders.get("/");
MvcResult result = mockMvc.perform(request)
.andExpect(model().attribute("loggedOut", loggedOut))
.andExpect(model().attribute("loggedIn", loggedIn))
.andExpect(model().attribute("profileEntity", "Not logged In"))
.andReturn();
Assertions.assertEquals("index", result);
}
}
@Controller
public class MainController {
private boolean loggedOut = true;
private boolean loggedIn = false;
private ProfileEntity profileEntity;
@Autowired
private ProfileDoa profileDoa;
@RequestMapping("/")
public String home_page(Model model) {
model.addAttribute("loggedOut", loggedOut);
model.addAttribute("loggedIn", loggedIn);
model.addAttribute("profileEntity", "Not logged In");
return "index";
}
@RequestMapping("/about")
public String about_page(Model model){
model.addAttribute("loggedOut", loggedOut);
model.addAttribute("loggedIn", loggedIn);
model.addAttribute("profileEntity", "Not logged In");
return "about";
}
@RequestMapping("/signup")
public String sign_up(){
return "signup";
}
@GetMapping("/signUpForm")
public String signUpForm(Model model, ProfileEntity profileEntity){
boolean checked = false;
model.addAttribute("profileEntity", profileEntity);
model.addAttribute("join", checked);
return "signUpForm";
}
@RequestMapping("/signUpFormError")
public String signUpFormError(Model model,
@ModelAttribute("error") boolean error,
@ModelAttribute("message") String message,
ProfileEntity profileEntity){
boolean checked = false;
model.addAttribute("join", checked);
model.addAttribute("error", error);
model.addAttribute("message", message);
model.addAttribute("profileEntity", profileEntity);
return "signUpForm";
}
@RequestMapping("/ForgotPasswordPage")
public String forgotPasswordPage(){
return "forgotPassword";
}
@GetMapping("/Forgot_Password")
public String ForgotPasswordResponse(){
return "forgotPassword";
}
}
@Transactional
public interface ProfileDoa extends JpaRepository<ProfileEntity, Long> {
public ProfileEntity findByEmail(String email);
}
对此的任何帮助都会有所帮助。 谢谢。
使用@WebMvcTest
,您可以为您的 web 层编写测试。 Spring 测试将为您创建一个上下文,其中包含测试您的应用程序这一部分所需的所有 bean:例如使用 @ @RestController
@Controller
@ControllerAdvice
ControllerAdvice、过滤器等注释的类。
所有其他 bean 都不会为您创建,因为它们不在web 层的 scope 中。 在您的情况下,这是您的MainController
注入的任何其他 bean。
你现在基本上有两个选择:
ProfileDoa
ProfileDoa
的真实 bean。 这将需要您的数据库和更多设置。对于选项一,您可以如下调整测试:
@WebMvcTest(MainController.class)
public class MainControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private ProfileDoa profileDoa;
private boolean loggedOut = true;
private boolean loggedIn = false;
@Test
@DisplayName("Navigating to Website Correctly Displays Index page")
public void loadsIndexPage() throws Exception {
RequestBuilder request = MockMvcRequestBuilders.get("/");
MvcResult result = mockMvc.perform(request)
.andExpect(model().attribute("loggedOut", loggedOut))
.andExpect(model().attribute("loggedIn", loggedIn))
.andExpect(model().attribute("profileEntity", "Not logged In"))
.andReturn();
Assertions.assertEquals("index", result);
}
}
由于我在MainController
中看不到与profileDoa
的任何交互,因此也无需准备任何模拟方法响应。 但是,如果您确实在某处调用了例如profileDao.findByEmail("mail@duke.io")
,则可以使用 Mockito 来准备结果:
ProfileEntity databaseResult = new ProfileEntitiy();
when(profileDao.findByEmail("THIS_HAS_TO_MATCH_YOUR_MAIL")).thenReturn(databaseResult);
对于选项二,您可以结合使用@SpringBootTest
和@AutoconfigureMockMvc
来加载整个 Spring 上下文(所有 bean)并使用MockMvc
:
@SpringBootTest
@AutoconfigureMockMvc
public class MainControllerTest {
// no mocking required as _real_ beans are used
}
在这里,您可能想使用例如Testcontainers来为您的测试启动一个数据库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.