我用弹簧靴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.UnsatisfiedDependencyException:创建名称为“ com.namur.service.VehicleServiceImplTest”的bean时出错:通过字段“存储库”表示不满意的依赖关系;嵌套的异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为’com.namur.repository.VehicleRepository’的合格Bean:期望至少有1个有资格作为自动装配候选的Bean。依赖项注释:org.springframework.beans.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:586)上的{@ org.springframework.beans.factory.annotation.Autowired(required = true)}
如果我用MockBean替换Autowired,它可以工作,但是我不知道为什么
它的工作原理,因为@MockBean内容替换或 增加 一个bean 到 Spring上下文。 在您的情况下,它将repository在Spring上下文中添加一个模拟。 因此,这不会抛出任何异常UnsatisfiedDependencyException。
@MockBean
repository
UnsatisfiedDependencyException
但这并不需要您最初使用时用来 从* 上下文中@Autowired注入bean 的需求。 *
@Autowired
@Autowired``@MockBean实际上,这是两个非常不同的事物,您永远无法替代相同的需求。
@Autowired``@MockBean
附带说明,您可能应该重新考虑构建测试的方式。
实际上,您正在使用SpringJUnit4ClassRunner跑步者。 这意味着您想使用Spring容器进行测试。 这是一种有效的方法。但是在这种情况下,为什么要在Spring容器之外创建VehiculeServiceImpl?
SpringJUnit4ClassRunner
service = new VehiculeServiceImpl(repository);
您应该注入服务。
请注意,在容器外部创建被测类的新实例也是一种非常有效的方法。 我们在编写普通单元测试时就这样做了。如果要这样做,请不要使用Spring Boot运行程序,否则会使测试变慢。