2015-04-29 5 views
1

В тестируемом классе, если его конструктор принимает параметр абстрактного класса, можем ли мы его издеваться с помощью mockito?Можно ли издеваться над абстрактным классом с помощью mockito?

Ex

public abstract AbstractClass{ 
} 

//Class under test 
public class SourceClass{    
    SourceClass(AbstractClass abstractClass){}    
} 

@RunWith(MockitoJUnitRunner.class 
public SourceClassTest{ 
@Mock 
    AbstractClass abstractClass; 
} 

всякий раз, когда я делаю это я получаю эту ошибку

java.lang.ExceptionInInitializerError 

Ther версия Mockito Я использую я 1.8.5

+0

возможно дубликат [Использование Mockito для проверки абстрактных классов] (http://stackoverflow.com/questions/1087339/using-mockito-to- test-abstract-classes) – Mureinik

ответ

3

Ну, этот код ниже работает нормально, просто скажите, нужно ли мне добавить комментарии, чтобы объяснить, что я написал, хорошо? (Эй, я использую Mockito 1.10.8):

import org.junit.Assert; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mock; 
import org.mockito.Mockito; 
import org.mockito.runners.MockitoJUnitRunner; 

abstract class AbstractClassToTest { 
    public abstract String doSomething(); 
} 

class ConcreteClass { 

    private String something; 

    public ConcreteClass(AbstractClassToTest aClass){ 
     this.something = aClass.doSomething(); 
    } 

    public String getSomething(){ 
     return this.something; 
    } 
} 

@RunWith(MockitoJUnitRunner.class) 
public class TempTest { 

    @Mock 
    private AbstractClassToTest myClass; 

    @Test 
    public void canAbstractClassToTestBeMocked() { 
     String expectedResult = "hello world!"; 
     Mockito 
      .when(myClass.doSomething()) 
      .thenReturn(expectedResult); 

     String actualResult = myClass.doSomething(); 

     Assert.assertEquals(expectedResult, actualResult); 
    } 

    @Test 
    public void canConcreteClassBeInstantiatedWithMock() { 
     String expectedResult = "hello world!"; 
     Mockito 
      .when(myClass.doSomething()) 
      .thenReturn(expectedResult); 

     ConcreteClass concrete = new ConcreteClass(myClass); 

     String actualResult = concrete.getSomething(); 

     Assert.assertEquals(expectedResult, actualResult); 
    } 
} 
+0

если вы делаете это с помощью downvoting, могли бы вы хотя бы добавить объяснение, почему? не дает ясного ответа на то, что задано? – germanio

+1

Я не сделал этого, ваш ответ работает. Спасибо! – striker

0

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

+1

Не верно: http://stackoverflow.com/a/4317631/1426891 –

+0

Хм ... вы должны добавить это как ответ :) – Cristik

+0

Возможно; Вместо этого я голосовал за закрытие. –

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