Что такое аннотация весной, которая говорит о том, что класс autowired не открыт для тестирования - PullRequest
0 голосов
/ 07 марта 2019

Я использовал @Profile в своем классе следующим образом.

@Service("myClass")
@Profile(value = {"stage", "uat", "prod"})
  public class MyClass{        
    //some code
  }         

Я автоматически подключаю MyClass в другом классе, скажем, YourClass.

public class YourClass{
  // some code 

  @Autowired
  private MyClass myClass;
  //some code
}

Теперь, когда я запускаю junit, ондает неудовлетворенную ошибку зависимости, поскольку профиль MyClass установлен только для uat, stage и prod, но не для unit.Есть ли способ, с помощью которого я могу автоматически подключить этот myClass, но его следует игнорировать при запуске junit?

Трассировка стека ошибок

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'yourClass': Unsatisfied dependency expressed through field 'myClass'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'MyClass' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:587)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:373)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1348)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:578)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:501)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
    at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$23/1013364696.getObject(Unknown Source)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:584)
    ... 51 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'MyClass' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1509)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:584)
    ... 65 more

Как решить эту проблему с автопроводкой?

1 Ответ

0 голосов
/ 07 марта 2019

Вы не можете игнорировать @Autowired MyClass при запуске тестов. Когда запускается тестовый пример и создается экземпляр класса «YourClass», Spring попытается внедрить в него bean-компонент «MyClass», а вы его не предоставляете.

Что вы можете сделать, это создать объект Mock или Stub в тестовом примере, чтобы заменить объект «MyClass».

Я предлагаю вам взглянуть на это: https://www.tutorialspoint.com/mockito/mockito_junit_integration.htm

Контрольные примеры должны иметь структуру, подобную этой:

@InjectMocks
YourClass yourClass;

@Before
public void init(){
     MockitoAnnotations.initMocks(this);
}

@Test
public void testcase(){
      YourClass yourClass = Mockito.mock(YourClass.class);

      when(yourClass.someMethod()).thenReturn("someResponse);

      /** do stuff **/
}

Удачи!

...