2015-05-04 4 views
0

У меня есть абстрактный метод checkStatus(), который имеет реализации в классе Checker.java. Но когда я выполняю тестовый пример Junit по методу абстрактного класса validate(), который в свою очередь вызывает checkStatus(), сбой из-за отсутствия пружинной зависимости в классе Checker.java.Неисправные тестовые примеры Junit для абстрактного метода

Информация представлена ​​ниже.

Абстрактный класс: класс

public abstract class MyAbstractClass 
{ 
    protected abstract boolean checkStatus(); 

    public boolean validate() 
    { 
     //Some code 
     return checkStatus(); 
    } 
} 

Реализация: тест

public class Checker extends MyAbstractClass 
{ 
    @Autowired 
    private StatusHelper helper; 

    public void setHelper(StatusHelper helper){ 
     this.helper = helper; 
    } 

    @Override 
    public boolean checkStatus() throws Exception{ 
     if(null == helper){ 
      throw new Exception("Helper is null"); 
     } 

     return helper.validateStatus(); 
    } 
} 

JUnit:

class AbstractClassTest 
{ 
    MyAbstractClass absClass = Mockito.mock(Checker.class, Mockito.CALLS_REAL_METHODS); 

    @Test 
    public void testStatusOfChecker()throws Exception { 
     boolean status = absClass.validate(); 
     assertEquals(status, true); 
    } 
} 

Я считаю, что я могу привнести вспомогательный объект вручную, как в следующем

Checker check = mock(Checker.class); 
StatusHelper helper = mock(StatusHelper.class); 
check.setHelper(helper); 

, но проблема здесь в том, что я не могу напрямую вводить объект absClass, так как setHelper() не наследуется.

Я могу вместо этого написать тестовый пример непосредственно в подкласс, но мне нужен был этот способ, чтобы проверить некоторые другие функции в методе абстрактного класса validate().

Может кто-нибудь помочь мне, как установить вспомогательный объект в подкласс или есть ли другой способ сделать это в Junit? Любая помощь или ссылки, содержащие релевантную информацию, очень заметны. Спасибо,

ответ

2

Единственный способ проверить абстрактный класс - это проверить реализацию (которая может быть анонимным классом).

public class AbstractClassTest { 
    @Test 
    public void testStatusOfChecker() throws Exception { 
    MyAbstractClass object = new MyAbstractClass() { 
     protected boolean checkStatus() { 
     return true; //this is the place to provide the expected value 
     } 
    } 
    boolean status = absClass.validate(); 
    assertEquals(status, true); 
    } 
} 

Если вы хотите проверить Checker реализацию, то вы не должны дразнить его.

public class CheckerTest { 
    @Test 
    public void test() { 
    StatusHelper helper = mock(StatusHelper.class); 
    Checker checker = new Checker(); 
    checker.setHelper(helper); 
    when(helper.validate()).thenReturn(true); 
    boolean status = checker.validate(); 
    assertEquals(status, true); 
    } 
} 

Кстати, я настоятельно рекомендую использовать инъекции конструктора (см Why field injection is evil). Тогда тест будет выглядеть следующим образом:

public class CheckerTest { 
    @Test 
    public void test() { 
    StatusHelper helper = mock(StatusHelper.class); 
    Checker checker = new Checker(helper); 
    when(helper.validate()).thenReturn(true); 
    boolean status = checker.validate(); 
    assertEquals(status, true); 
    } 
} 
Смежные вопросы