Spring boot 必须使用mockbean而不是自动连线
我用弹簧靴2 我创建了一个基本测试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
@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
注释这个类可能会这样做。根据这个问题的标题,这应该是可以接受的答案。。简明扼要根据这个问题的标题,这应该是公认的答案。。简明扼要。。