2016-09-05 9 views
0

Я пытаюсь протестировать ClassA, который использует 2 службы. Один сервис должен быть автоуведомлен, а один должен рассматриваться как издевавшийся объект. К сожалению, издевались объект@InjectMocks не работает во время автономной работы остатков зависимостей

не вводили

к моему испытанной классу. Все поля ведут себя так, как если бы я использовал только функцию автотюнинга весны, чтобы настроить ее. Тестируемый ClassA также наследуется от другого абстрактного класса. Если не используется аутсорсинг, то издевательский объект передается успешно. К сожалению, я не могу издеваться над ServiceDao, поэтому я пытаюсь объединить анкеты @InjectMocks и @Autowiring.

Класс А.

public ClassA extends AbstractClassA<ClassOne, ClassTwo>{ 

    @Autowired 
    protected ServiceOne serviceOne;  //this services needs to be mocked 

    @Override 
    protected List<ClassTwo> testedMethod(){ 
     return serviceOne.getList();  //here method is not returning mocked objects 
    }         //as it supposed to do. 
    ........ 
} 

AbstractClass

public class AbstractClassA<T1 extends InterfaceOne, T2 extends InterfaceTwo){ 
    @Autowired 
    protected ServiceDAO serviceDAO; //this services needs to be autowired 

    protected abstract List<T2> testedMethod(); 

} 

TestClass.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath*:testApplicationContext.xml"}) 
public class Test { 
    @Mock 
    private ServiceOne serviceOne; //this mock object and it's return 
            //objects are set properly 


    @Autowired 
    @InjectMocks 
    private ClassA classA; //all fields are autowired, including the services that should be mocked 

    @Before 
    public void setData(){ 
     Mockito.Annotations.initMocks(this); 
     List<ClassTwo> result = Arrays.asList(new ClassA()); 
     when(serviceOne.testedMethod().thenReturn(result); //here when i invoke mocked object it is returning correct list. 
    } 
} 
+0

Я бы не стал смешивать различные системы впрыска. Вместо этого просто настройте свою Spring, чтобы создать издеваемую фасоль и ввести ее через Spring. –

+0

мог бы объяснить, что вы имеете в виду о создании издевающегося боба? Как я могу сказать spring brean, чтобы вернуть sth при вызове метода? – Dago

+0

Зависит от того, что вы используете, конфигурации XML, JavaConfig и т. Д. Но во всех случаях вы можете создать тестовую конфигурацию, которая просто использует Mockito (например) для создания компонента, который является макетом. Затем вы можете ввести этот компонент в свой тест и сказать ему, что делать. –

ответ

1

В этом случае, вероятно, лучше, чтобы дразнить впрыскиваемый боб с помощью вашей Спринг конфигурации контекста теста. Если вы не можете сделать это легко, вы можете использовать класс Springs ReflectionTestUtils, чтобы имитировать отдельные объекты в вашем сервисе.

В тестовом файле конфигурации XML можно определить высмеивал боб:

<bean id="serviceOne" class="org.mockito.Mockito" factory-method="mock"/> 
    <constructor-arg value="com.package.ServiceOne"/> 
</bean> 

В Java стороне:

@Bean 
public ServiceOne serviceOne() { 
    return mock(ServiceOne.class); 
} 

В тестовом случае вы можете @Autowire ServiceOne serviceOne и использовать его в качестве фиктивного объекта:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath*:testApplicationContext.xml"}) 
public class Test { 
    @Autowired 
    private ServiceOne serviceOne; 

    @Autowired 
    private ClassA classA; 

    @Before 
    public void setData(){ 
     Mockito.Annotations.initMocks(this); 
     List<ClassTwo> result = Arrays.asList(new ClassA()); 
     when(serviceOne.testedMethod()).thenReturn(result); 
    } 
} 
+0

ok, но где я могу указать testMethod() возвращаемый объект? – Dago

+0

Я изменил ответ на содержащий предложенный тестовый класс – Xantier

+0

К сожалению, я не вижу корреляции между (mockedBean), который является объявлением в XML и его использованием в классе Test. – Dago

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

  • Нет связанных вопросов^_^