Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 必须使用mockbean而不是自动连线_Spring Boot_Junit - Fatal编程技术网

Spring boot 必须使用mockbean而不是自动连线

Spring boot 必须使用mockbean而不是自动连线,spring-boot,junit,Spring Boot,Junit,我用弹簧靴2 我创建了一个基本测试 @RunWith(SpringJUnit4ClassRunner.class) public class VehicleServiceImplTest { private VehiculeServiceImpl service; @Autowired private VehicleRepository repository; @Before public void prepare() { servi

我用弹簧靴2

我创建了一个基本测试

@RunWith(SpringJUnit4ClassRunner.class)
public class VehicleServiceImplTest {

    private VehiculeServiceImpl service;

    @Autowired
    private VehicleRepository repository;

    @Before
    public void prepare() {
        service = new VehiculeServiceImpl(repository);
    }

    @Test
    public void test(){

    }

}
我明白了

org.springframework.beans.factory.unsatifiedDependencyException: 创建名为的bean时出错 'com.namur.service.VehicleServiceImplTest':未满足依赖关系 通过“存储库”字段表示;嵌套异常是 org.springframework.beans.factory.noSuchBean定义异常:否 “com.namur.repository.VehiclerRepository”类型的限定bean 可用:至少需要1个符合autowire条件的bean 候选人依赖项批注: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 在 org.springframework.beans.factory.annotation.AutoWiredNotationBeanPostProcessor$AutoWiredFeldElement.inject(AutoWiredNotationBeanPostProcessor.java:586)


如果我用MockBean替换Autowired,它会工作,但我不知道为什么,这是因为您没有为测试提供任何关于spring上下文的指示,因此autowire根本没有可用的bean

通过提供@MockBean,您实际上是在提供一个测试上下文,其中包含一个现有bean,该bean是对VehiclerRepository类的模拟

您可以使用@SpringBootTest注释,它将加载一个spring上下文供您在测试中使用。然后,您应该能够@Autowire实际存储库:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class VehicleServiceImplTest {

这是因为您没有向测试提供任何关于spring上下文的指示,因此autowire根本没有可用的bean

通过提供@MockBean,您实际上是在提供一个测试上下文,其中包含一个现有bean,该bean是对VehiclerRepository类的模拟

您可以使用@SpringBootTest注释,它将加载一个spring上下文供您在测试中使用。然后,您应该能够@Autowire实际存储库:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class VehicleServiceImplTest {
如果我用MockBean替换Autowired,它会工作,但我不知道为什么

它之所以有效,是因为
@MockBean
替换或一个bean添加到Spring上下文中。
在您的例子中,它在Spring上下文中添加了一个
存储库
mock。
因此,这无法引发任何
未满足的PendencyException

但这并不是您最初使用的
@Autowired
所需要的,它设计用于从上下文注入bean

@Autowired
@MockBean
确实是两种截然不同的东西,你永远无法用它们来代替相同的需求。


作为旁注,您可能应该重新考虑构建测试的方式。

实际上,您正在使用
SpringJUnit4ClassRunner
runner。
这意味着您希望使用Spring容器进行测试。
这是一种有效的方法。但在这种情况下,为什么要在Spring容器外部创建VehicleuleServiceImpl

 service = new VehiculeServiceImpl(repository);
您更应该注入服务。

请注意,在容器外部创建被测类的新实例也是一种非常有效的方法。
我们在编写简单的单元测试时这样做。如果您想这样做,不要使用Spring引导运行程序,顺便说一句,这会使测试速度变慢

如果我用MockBean替换Autowired,它会工作,但我不知道为什么

它之所以有效,是因为
@MockBean
替换或一个bean添加到Spring上下文中。
在您的例子中,它在Spring上下文中添加了一个
存储库
mock。
因此,这无法引发任何
未满足的PendencyException

但这并不是您最初使用的
@Autowired
所需要的,它设计用于从上下文注入bean

@Autowired
@MockBean
确实是两种截然不同的东西,你永远无法用它们来代替相同的需求。


作为旁注,您可能应该重新考虑构建测试的方式。

实际上,您正在使用
SpringJUnit4ClassRunner
runner。
这意味着您希望使用Spring容器进行测试。
这是一种有效的方法。但在这种情况下,为什么要在Spring容器外部创建VehicleuleServiceImpl

 service = new VehiculeServiceImpl(repository);
您更应该注入服务。

请注意,在容器外部创建被测类的新实例也是一种非常有效的方法。

我们在编写简单的单元测试时这样做。如果您想这样做,请不要使用Spring Boot runner,顺便说一句,这会使测试速度变慢。

我的服务在参数中使用存储库这没关系。您可以通过以下方式将其注入测试:
@Autowired private VehicleService服务。您只需确保在测试类声明中正确地定义了应用程序上下文。用
@SpringBootTest
注释类就可以了。我的服务在参数中有一个存储库这没关系。您可以通过以下方式将其注入测试:
@Autowired private VehicleService服务。您只需确保在测试类声明中正确地定义了应用程序上下文。用
@SpringBootTest
注释这个类可能会这样做。根据这个问题的标题,这应该是可以接受的答案。。简明扼要根据这个问题的标题,这应该是公认的答案。。简明扼要。。