小编典典

必须使用嘲讽而不是自动装配

spring-boot

我用弹簧靴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,它可以工作,但是我不知道为什么


阅读 281

收藏
2020-05-30

共1个答案

小编典典

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

它的工作原理,因为@MockBean内容替换或 增加 一个bean Spring上下文。
在您的情况下,它将repository在Spring上下文中添加一个模拟。
因此,这不会抛出任何异常UnsatisfiedDependencyException

但这并不需要您最初使用时用来 从* 上下文中@Autowired注入bean 的需求。 *

@Autowired``@MockBean实际上,这是两个非常不同的事物,您永远无法替代相同的需求。


附带说明,您可能应该重新考虑构建测试的方式。

实际上,您正在使用SpringJUnit4ClassRunner跑步者。
这意味着您想使用Spring容器进行测试。
这是一种有效的方法。但是在这种情况下,为什么要在Spring容器之外创建VehiculeServiceImpl?

 service = new VehiculeServiceImpl(repository);

您应该注入服务。

请注意,在容器外部创建被测类的新实例也是一种非常有效的方法。
我们在编写普通单元测试时就这样做了。如果要这样做,请不要使用Spring Boot运行程序,否则会使测试变慢。

2020-05-30