2014-10-30 2 views
0

У меня есть класс:испытания конкретный метод абстрактного класса, содержащего интерфейс вызова

public abstract class Foo{ 
    @Inject 
    private FooBarClient foobarclient; 

    public abstract long dofoo1(); 
    public abstract long dofoo2(); 

    public void doBar1(){ 
    foobarClient.docall(faa); 
    } 

} 

я хотел бы проверить doBar1() метод, поэтому я сделал мой тестовый класс, как это:

@RunWith(MockitoJUnitRunner.class) 
public class FooTest { 

private Foo foo; 

@Mock 
private FoobarClient foobarClient; 

@Before 
public void init() { 
    foo = new Foo() { 
     dofoo1(){}; 
    }; 
} 

@Test 
public void testControleValiditeSite() throws Exception { 
    // G 
    Response response=....; 
    Mockito.when(foobarClient.docall(Mockito.any(faa.class))).thenReturn(
      response); 
    // W 
    foo.doBar1(); 
    // T; 
} 

Но я получил исключение нулевого указателя на fooBarclient в doBar1().

Я также пытался издеваться аннотацию с:

Foo foo = Mockito.mock(Foo,Mockito.CALLS_REAL_METHODS); 

Есть ли лучший способ сделать это испытание?

EDIT:

Я использовал отражение. Теперь код выглядит следующим образом:

@RunWith(MockitoJUnitRunner.class) 
public class FooTest { 

private Foo foo; 

@Mock 
private FoobarClient mockedFoobarClient; 

@Before 
public void init() { 
    foo = new Foo() { 
     dofoo1(){}; 
    }; 
    **MockitoAnnotations.initMocks(this);** 
    **ReflectionTestUtils.setField(foo , "foobarClient", mockedFoobarClient);** 
} 

@Test 
public void testControleValiditeSite() throws Exception { 
    // G 
    Response response=....; 
    Mockito.when(foobarClient.docall(Mockito.any(faa.class))).thenReturn(
      response); 
    // W 
    foo.doBar1(); 
    // T; 
} 

ответ

0

В тестовом классе, создать неабстрактный внутренний класс, который расширяет Foo. Используйте это в своем тесте.

+0

Здравствуйте, моя проблема связана с внутренним вызовом. Не абстрактно. привет, –

+0

Как вы устанавливаете 'foobarclient' в созданном вами экземпляре' foo'? Я не думаю, что бегун «Mockito» поддерживает аннотацию '@ Inject'. Либо установите его явно, либо используйте '@ InjectMocks' –

+0

Я модифицировал' code' @Mock частный FoobarClient foobarClient; to @InjectMock. И я называю реализацию вместо интерфейса, но теперь Mockito.when (....) не совпадают. привет, –

1

Вы можете не нужно издеваться, просто создать экземпляр в тесте (при условии, что вы в состоянии изменить тип доступа клиента от private к protected).

Foo foo = new Foo() { 
    @Override 
    public long dofoo1() { 
     return 0; 
    } 

    @Override 
    public long dofoo2() { 
     return 0; 
    } 

    public void setClient(FooBarClient client) { 
     foobarclient = client; 
    } 
}; 

foo.setClient(client); 
foo.doBar1(); 
+0

Здравствуйте, К сожалению, я не могу использовать набор():/ –

+0

Можете ли вы изменить тип доступа для защищенного, а не для клиента? – StuPointerException

+0

нет, я не могу. привет, –

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