2016-09-30 10 views
1

Я хочу протестировать метод класса ServicetestB1Method2 путем смещения переопределенного метода a1Method2 класса B1. Я не хочу ничего менять в классе A1 и B1. Я использую mockito 1.9.0 и powermockito 1.4.12. Следующий код, который я пытаюсь:Mock переопределенный метод с использованием mockito powermokito

UnitTestService класс:

import static org.mockito.Mockito.*; 

import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.Mockito; 
import org.mockito.MockitoAnnotations; 
import org.powermock.api.mockito.PowerMockito; 
import org.testng.Assert; 
import org.testng.annotations.Test; 

public class UnitTestService { 

    @Mock 
    B1 b1; 
    @InjectMocks 
    Service service = new Service(); 

    @Test 
    public void testB1Method2() throws Exception { 
     MockitoAnnotations.initMocks(this); 
     when(b1.a1Method2()).thenReturn("mockvalue"); 
     PowerMockito.whenNew(B1.class).withArguments(Mockito.any()).thenReturn(b1); 
     String output = service.serviceMethod(); 
     System.out.println("=====" + output); 
     Assert.assertTrue("mockvalue".equalsIgnoreCase(output), "testA1Method2 failed!"); 
    } 

} 

Класс обслуживания:

public class Service { 

    public String serviceMethod() { 
     B1 b1 = new B1("some data"); 
     return b1.a1Method2(); 
    } 

} 

класс A1:

public abstract class A1 { 

    public A1(String data) { 
     //doing many thing with data 
    } 

    public String a1Method1() { 
     return "from a1Method1"; 
    } 

    public String a1Method2() { 
     return "from a1Method2"; 
    } 

} 

B1 Класс:

public class B1 extends A1 { 

    public B1(String data) { 
     super(data); 
    } 

    @Override 
    public String a1Method1() { 
     return "a1Method1 from B1 class"; 
    } 

} 

Я бегу класс UnitTestService используя testNG в затмении. И здесь вызывается фактический метод в классе B1 a1Method2, поскольку он печатает в консоли «===== from a1Method2». т.е.: здесь кажется, что mockito не может издеваться над этим методом.

Какое изменение кода должно быть сделано в классе UnitTestService, чтобы высмеять класс B1 a1Method2?

+1

Возможный дубликат [Использование PowerMockito.whenNew() не получает издевательства и вызывается оригинальный метод] (http://stackoverflow.com/questions/25317804/using-powermockito-whennew-is-not-getting-mocked- and-original-method-is-called) – Magnilex

ответ

0

Вы создали трудно проверить код там, для совершенно нет веской причины. Что ломает вам шею, так это маленький небольшой звонок в новый B1 в вашем классе обслуживания.

Если вы хотите использовать зависимую инъекцию для этого объекта; то вам совершенно не нужно иметь дело с powermock и насмешками унаследованных методов. Потому что тогда вы могли бы просто создать «макет» B1; передайте это к вашим услугам; и тогда у вас есть полный контроль над тем, что будет происходить во время вашего теста.

Таким образом, жизнеспособной альтернативой может быть избежать сложной тестовой установки, просто улучшив ваш производственный код, чтобы было легче протестировать.

Смотрите эти videos, чтобы лучше понять, о чем я говорю!

+0

Мне не следует создавать какой-либо новый объект в методе службы? –

+0

Я говорю: когда вы используете ** новый **, вы теряете способность (легко!) Управлять своими объектами. Таким образом, избегая вызовов на * new * **, вы можете улучшить код. Как сказано: A) читайте о ** инъекции зависимостей ** и B) смотрите эти видеоролики; по крайней мере, первые ... – GhostCat