一个更一般的问题。如果在常规spring管理的类中使用构造函数注入,那么这些类将自动连接,而不需要@autowired注解,即。e、 地址:
@Service
class MailService(
private val projectService: ProjectService,
private val mailer: Mailer
) { ... }
在@springboottest类中遵循相同的构造函数注入原则,您需要将@autowired注解设置为构造函数参数,否则它将无法注入类,即。e、 地址:
@SpringBootTest
internal class MailerTest(
@Autowired private val mailer: Mailer
) { ... }
为什么会出现这种差异?
1条答案
按热度按时间d4so4syb1#
在springboot应用程序中,spring负责连接bean。
对于JUnit5,必须将spring管理的bean注入junit管理的测试类示例。幸运的是,JUnit5提供了一种通过parameterresolver实现这一点的方法。
@SpringBootTest
注册springextension,除其他功能外,它还充当parameterresolver:public static boolean isAutowirable(Parameter parameter, int parameterIndex) {
Assert.notNull(parameter, "Parameter must not be null");
AnnotatedElement annotatedParameter = getEffectiveAnnotatedParameter(parameter, parameterIndex);
return (AnnotatedElementUtils.hasAnnotation(annotatedParameter, Autowired.class) ||
AnnotatedElementUtils.hasAnnotation(annotatedParameter, Qualifier.class) ||
AnnotatedElementUtils.hasAnnotation(annotatedParameter, Value.class));
}
org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [test.Mailer mailer] in constructor [public test.MailServiceTest(test.Mailer)].