2015-10-28 4 views
2

Предположим, у меня есть класс под названием MainClass.Как создать фиктивный весенний боб для класса, имеющего автономные зависимости

public class MainClass { 
    @Autowired 
    AutoWiredClass autoWiredClass; 
} 

Я пытаюсь создать макет из MainClass с использованием Mockito.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
public class AutowiringTest { 
    @Configuration 
    static class AutowiringTestConfiguration{ 

     @Bean 
     public MainClass mainClass() { 
      return Mockito.mock(MainClass.class); 
     } 
    } 

    @Autowired 
    MainClass mainClass; 

    @Test 
    public void testBeanCreation(){ 
     assertNotNull(mainClass); 
    } 
} 

Я получаю эту ошибку при запуске тестового примера.

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: autowiring.AutoWiredClass autowiring.MainClass.autoWiredClass; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [autowiring.AutoWiredClass] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

Я знаю, что могу достичь этого, используя @Mock и @InjectMocks. Но это не то решение, которое я хочу.

Мое требование состоит в том, чтобы создать фик-боб MainClass без создания фактического компонента AutowiredClass. Пожалуйста, помогите мне, как этого достичь.

+0

Что вам нужно для всей весны, если вы хотите создать макет MainClass? Макет ничего не будет содержать ... –

+0

Я просто привел пример. Я использую случай, когда класс, который я хочу протестировать, имеет несколько полей @Autowired. Я хочу, чтобы некоторые из них приходили с весны, а некоторые издевались над ними. –

+0

Но в этом случае основной класс сам по себе не может быть макетом, что, кажется, имеет место здесь. Вы можете поместить mocks в не-mock, но наоборот, это не так часто и будет немного сложнее, возможно, для объекта Answer, который перенаправляет некоторый вызов на mocks, а некоторые - на реальные объекты. –

ответ

1

Как уже отмечал Флориан, вы должны попытаться создать тесты, которые не нужны весной, и у вас не будет этих проблем.

Но, если нет обходного пути, вы можете использовать немного магии с помощью AutoMockRegistryPostProcessor.

Вам просто нужно добавить AutoMockRegistryPostProcessor к @ContextConfiguration, и он будет создавать издевается для отсутствующих зависимостей:

@ContextConfiguration(classes = { AutowiringTest.class, AutoMockRegistryPostProcessor.class }) 
public class AutowiringTest { 
    // no complains anymore, a mockito mock will be created for AutoWiredClass 

AutoMockRegistryPostProcessor класс не в мавена, вам нужно будет скопировать его в свой проект.

Документ here.

+0

Это не сработало. Боб MainClass не обрабатывался почтовым процессором. 'String [] beanNames = registry.getBeanDefinitionNames(); System.out.println (Arrays.toString (beanNames)); ' Результаты не имеют mainClass как один из компонентов. –

+0

Это было результатом заявления печати. '[org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalRequiredAnnotationProcessor, org.springframework.context.annotation.internalCommonAnnotationProcessor, autowiringTest, autoMockRegistryPostProcessor, org.springframework .context.annotation.ConfigurationClassPostProcessor.importAwareProcessor, org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor] ' –

+0

Это сработало. Я забыл добавить AutowiringTest.class в @ContextConfiguration. Но могу ли я знать, почему это требуется? Основной компонент был уже создан без этих изменений. –

Смежные вопросы