【问题标题】:SpringBoot Application Junit test not able to autowireSpring Boot Application Junit 测试无法自动装配
【发布时间】:2020-02-09 01:11:08
【问题描述】:

我有一个应用程序类

  @SpringBootApplication
   public class Application{
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
     }
   }

我有一个控制器类

  @RestController
  public class HelloController {

   @RequestMapping("/")
   public String index() {
    return "Greetings from Spring Boot!";
   }

 }

而且,我想为 Application Test 编写一个测试用例,以确保创建的实例是 HelloController 类型的

     @RunWith(SpringRunner.class)
     @SpringBootTest
     public class ApplicationTest{
        @Autowired
        private HelloController helloController;

       @Test
        public void test(){
          assertNotNull(helloController);
         }
       }

但是,我在自动连接 hellocontroller 变量时出错(没有找到 helloController 类型的bean)。根据我的理解,@SpringBootTest 应该创建上下文并返回一个实例。我们不需要编写任何上下文 xml 或使用任何 AnnotationConfig 类来获取实例。缺少什么?

【问题讨论】:

  • 发布一个完整的最小示例来重现该问题。它必须具有包声明以及错误的准确和完整的堆栈跟踪。
  • 您的应用程序是否运行正常,我的意思是当您启动并点击“/”端点时,它是否有效?
  • 至少你可以在堆栈跟踪中添加错误消息
  • 这是错误,我在定义变量时遇到了错误。 “无法自动装配。找不到 'HelloController' 类型的 bean”
  • 你能显示完整的堆栈跟踪吗?

标签: java spring spring-boot junit


【解决方案1】:

抱歉,我之前发布的代码是错误的。所以删除了它

这似乎更相关 Testing a controller with an auto wired component is null when calling the controller from a test case

【讨论】:

  • 我没有解决这个问题,我仍然无法自动接线。找不到 'HelloController' 类型的 bean。
  • 对不起,之前创建新实例的解决方案是错误的。这对于服务而不是控制器是正确的。你能试试上面的链接吗
  • 我研究了该解决方案,如果我使用 Inject mocks 而不是 Autowired for HelloController,则能够运行应用程序。但是 Injectmock 是您创建实例而不是从 spring 上下文中检索。我想在这里测试那个场景。
  • 上述链接的第一个答案:使用 MockMvc 直接到达终点(“/url”),它会到达你的控制器,你不必使用 injectmock。在这里你没有创建控制器实例但最终做同样的事情对吗?
【解决方案2】:

通过在 @SpringBootTest(Classes = {HelloController.class}) 中添加类名解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 2017-02-25
    • 2014-03-11
    • 2020-03-24
    • 2014-07-30
    • 1970-01-01
    • 2011-04-09
    • 2020-06-22
    相关资源
    最近更新 更多