2015-01-28 2 views
0

У меня есть класс Service, который я хочу проверить. В принципе, я столкнулся с проблемой, так как хочу, чтобы объект Service был частично изделен. Только obj1 следует высмеивать, а остальные другие сотрудники должны быть реальными. Мой код похож на этот:Хотите, чтобы весенний боб посмеялся, а также реальные реализации + весна + mockito

@Component 
public class Service { 

    @Autowired 
    Object1 obj1; 

    @Autowired 
    Object2 obj2; 

    public void validate(){ 
     obj1.isValid(); 
     obj2.isActive(); 

    } 
} 

Теперь в то время как метод тестирования валидации указанного выше Service класса, я хочу, чтобы дразнить метод о bj1.isValid() при вызове реальной реализации obj2

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({"classpath:conf/test-context.xml"}) 
public class ServiceTest { 

    @InjectMocks 
    Service service; 

    @Mock 
    OBject1 obj1; 

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

    } 


    @Test 
    public void testValidate(){ 
     service.validate(); 
     //assert and other stuff 
    } 
} 

Этот тест терпит неудачу и когда я отлаживал метод проверки, я обнаружил, что экземпляр obj1 вводится как высмеиваемый, как ожидалось, в классе Service, но obj2 вводится как null. Следовательно, тест не удается ... Есть ли способ достичь этого?

update Как я читал в некоторых ответах SO, я использовал springockito. Я добавил ниже вещь в тестовый класс, как показано ниже, но все же результат:

@ReplaceWithMock 
@Autowired 
Object2 obj2 

ответ

2

Вы должны добавить @Autowired аннотация к объекту service, так что все остальные атрибуты в service вводятся нормально, а издеваемые объекты вводятся для издевающихся типов.

В приведенном ниже примере, нормальный боб Class2 будет введен в service, но @InjectMocks аннотаций будет впрыскивать высмеивал объект Class1.

Сервис:

@Component 
public class Service 
{ 
    @Autowired 
    private Class1 class1; 

    @Autowired 
    private Class2 class2; 

    public Class1 getClass1() 
    { 
     return class1; 
    } 

    public Class2 getClass2() 
    { 
     return class2; 
    } 
} 

Class1:

@Component 
public class Class1 
{ 
    public String getName() 
    { 
     return "Class1"; 
    } 
} 

Class2:

@Component 
public class Class2 
{ 
    public String getName() 
    { 
     return "Class2"; 
    } 

} 

Тест:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({ 
    "classpath:application-context.xml" 
}) 
public class ServiceTest 
{ 
    @Mock 
    private final Class1 class1 = Mockito.mock(Class1.class); 

    @InjectMocks 
    @Autowired 
    private Service service; 

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

    @Test 
    public void test() 
    { 
     Mockito.when(class1.getName()).thenReturn("MockClass1"); 
     Assert.assertNotNull(service); 
     Assert.assertEquals("MockClass1", service.getClass1().getName()); 
     Assert.assertNotNull("Class2", service.getClass2().getName()); 
    } 
} 
0

Это может быть достигнуто с помощью @Spy

Ваш код должен выглядеть как-то ниже

public class ServiceTest { 

    @InjectMocks 
    Service service; 

    @Mock 
    OBject1 obj1; 

    @Spy 
    Object obj2 = new SomeObject("argument"); 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
    } 
} 
+0

Спасибо, что ответили, но у моего объекта Object2 есть другие автоувеличиваемые зависимости, которые я должен проверить, поэтому это не подходит для меня ... – Rips

0

Другим способом достижения этого является использование springocito.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader = SpringockitoContextLoader.class,locations={"classpath:conf/test-context.xml"}) 

public class ServiceTest 
{ 
    @ReplaceWithMock 
    @Autowired 
    private Object1 object1 

    @Autowired 
    private Service service; 

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

    @Test 
    public void test() 
    { 
    //assert stuff 
    } 
} 

служба получит правильно заселена за исключением Object1, которые будут иметь издевались instance.Rest всех autowired внутренних бобов будет заполняться.

0

Не используйте автоподатчики и инжекторы. Это плохая практика.Вы можете использовать как @InjectMocks, так и @Spy, чтобы имитировать реальный объект и позволить насмехаться внутри этого объекта-шпиона.

+0

Когда я использую шпион над объектом2, он издевается над всем объектом. Но, например, obj2 имеет dep1, а dep2 имеет 2 зависимости. Я хочу высмеять только dep1.When я использую Spy, он издевается над обоими из них. В этом случае работает принятый ответ. – Rips

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